'wpf'에 해당되는 글 168건

  1. 2018.01.02 WPF에서 MiniDump 뜨는법
  2. 2017.12.07 다중 모니터에서 전체 화면 실행
  3. 2017.11.24 c++ DLL에서 예외 오류 잡는법
  4. 2017.10.19 wpf FlipView
  5. 2017.09.12 Listview , Button MouseOver, Selcted Color 제거
  6. 2017.09.06 Converter를 쓰지 않고 바인딩된 TextBlock에 글자를 추가하고 싶을때
  7. 2017.08.22 LIST의 UI에 즉각적으로 바인딩 업데이트를 하고 싶을때..
  8. 2017.08.08 MVVM 하위 컨트롤 바인딩
  9. 2017.08.08 ViewModel 끼리의 통신
  10. 2017.08.07 해상도에 따른 이미지 크기 변경
  11. 2017.07.25 CommandParameter를 이용하여 List 안에 버튼 파라미터 전달
  12. 2017.07.24 List Object를 Copy 해보자. (ICloneable)
  13. 2017.07.21 non-ASCII를 없애보자.
  14. 2017.07.21 Base 모델 클래스에 있는 데이터를 상속 클래스에 COPY 하기
  15. 2017.07.18 listbox에서 오른쪽 정렬하고 싶을때
  16. 2017.07.17 [WPF] NavagionManager
  17. 2017.07.17 MVVM Button Click Command 사용법
  18. 2016.10.24 MVVM을 쓰면서... (3)
  19. 2016.10.24 바인딩이란?
  20. 2016.09.23 반복적인 xaml name 을 이용할때
  21. 2016.09.08 [WPF] ListBox Selected 되었을때 내용 바꾸기
  22. 2016.08.23 Drag and Drop Cursor (커서) 변경
  23. 2016.08.23 ListBox Drag and Drop
  24. 2016.07.15 app.config 수정 edit
  25. 2016.06.08 [WPF] IsolatedStorageManager
  26. 2016.05.19 프로그램 죽을때 바로 재시작하게 하기
  27. 2016.04.25 ListBox에서 Item 스크롤 터치시 화면 전체가 움직이던 문제
  28. 2016.04.25 SoundPlayer 사용
  29. 2016.04.21 blend 디자인모드 무시
  30. 2016.04.19 Image Filter 사용하기 (이미지 프로세싱)
wpf2018.01.02 19:05

간략한 소스


MiniDump.cs


wpf에서는 

 AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;


으로 했을시에 작동한다.

첨에 모르고 

this.DispatcherUnhandledException += App_DispatcherUnhandledException;


이렇게 했는데 계속 0kb 로 덤프가 안떠져서 삽질을...


덤프가 만들어지면


1. exe 실행파일

2. pdb 파일

3. dmp  파일


3개 파일을 한 폴더에 넣고 dmp 클릭후 비쥬얼 스튜디오에서 혼합으로 디버그를 선택하면 오류난 위치를 알려준다.



Posted by 동동(이재동)
TAG minidump, WPF
wpf2017.12.07 14:25

다중모니터에서 WindowState="Maximum"으로 하게 되면 한모니터에서만 나오게 된다.

이를 해결하기 위해서

 그냥 Window에 맞게 만들면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
 
            var ratio = Math.Max(System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width / SystemParameters.PrimaryScreenWidth,
                            System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height / SystemParameters.PrimaryScreenHeight);
 
            int monitorNumber = 1;
 
            int left = Convert.ToInt32(ConfigurationManager.AppSettings["MonitorLeft"]);
            int center = Convert.ToInt32(ConfigurationManager.AppSettings["MonitorCenter"]);
            int right = Convert.ToInt32(ConfigurationManager.AppSettings["MonitorRight"]);
 
            foreach (var screen in System.Windows.Forms.Screen.AllScreens)
            {
                if (monitorNumber == left)
                {
                    var window = new MainWindow();
                    ShowWindow(window, screen, ratio);
                }
                else if (monitorNumber == center)
                {
                    var videoWindow = new VideoWindow();
                    videoWindow.PlayVideo("did2");
                    ShowWindow(videoWindow, screen, ratio);
                }
                else if (monitorNumber == right)
                {
                    var videoWindow = new VideoWindow();
                    videoWindow.PlayVideo("did3");
                    ShowWindow(videoWindow, screen, ratio);
                }
                monitorNumber++;
            }
            Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
        }
 
        public void ShowWindow(Window window, System.Windows.Forms.Screen screen, double ratio)
        {
            window.Left = screen.WorkingArea.Left / ratio;
            window.Top = screen.WorkingArea.Top / ratio;
            window.Width = screen.WorkingArea.Width / ratio;
            window.Height = screen.WorkingArea.Height / ratio;
            window.Show();
            window.WindowState = WindowState.Maximized;
        }


중요한포인트는 screen.WorkingArea 이다. 여기서 각장 포지션에 맞게 지정하면 된다.

Posted by 동동(이재동)
wpf2017.11.24 17:22


C++에서 사용하는 DLL에서 오류가 나면 try catch에서 잡히지 않는문제를 해결 하였다.




AccessViolationException 예외는 네이티브 쪽에서 메모리 접근 위반을 했을 때 발생 하는 예외 이다.

할당되지 않은 메모리 또는 코드가 접근 권을 갖지 않는 메모리를 읽거나 쓰기를 시도하면 네이티브 코드(언 세이프 코드)에서 액세스 위반이 발생한다.

 

그러나 보통 System.Exception의 파생 클래스인 셈이라서 catch에서 이 예외를 포착할 것으로 생각하지만 애플리케이션은 이 예외를 잡지 못해서 이상 종료를 한다.

 

.NET Framework 3.5 이전에는 AccessViolationException을 catch 할 수 있었지만 .NET Framework 4 이후에서는 못하도록 바뀌었다.

 

이 예외를 잡고 싶다면 두 가지 방법을 하나를 하면 된다.

1. HandleProcessCorruptedStateExceptionsAttribute

AccessViolationException을 catch 하고 싶은 메소드에HandleProcessCorruptedStateExceptionsAttribute를 붙여서 잡을 수 있다.

[HandleProcessCorruptedStateExceptions]

void DoSomething()

{

try {

AccessViolationException를 발생하는();

} catch(AccessViolationException e) {

//---포착 가능

}

}

 

 

2.legacyCorruptedStateExceptionsPolicy

하위 호환성 때문에 기존(.NET Framework 3.5 이전)처럼 애플리케이션 전체에서 포착할 수 있도록 하고 싶은 경우. 구성 파일(*. config)에<legacyCorruptedStateExceptionsPolicy>요소를 넣어서 해결할 수 있다.

<configuration>

<runtime>

<legacyCorruptedStateExceptionsPolicy enabled="true"/>

</runtime>

</configuration>

 

 

출처: http://blog.xin9le.net/entry/2015/07/22/053738

Posted by 동동(이재동)
wpf2017.10.19 16:27

https://www.codeproject.com/Articles/741026/WPF-FlipView


나중에 정리

Posted by 동동(이재동)
wpf2017.09.12 12:40

listview
1
2
3
4
5
6
7
8
9
10
11
12
                <ListView.ItemContainerStyle>
                    <Style TargetType="{x:Type ListViewItem}">
                        <Setter Property="Background" Value="Transparent" />
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type ListViewItem}">
                                    <ContentPresenter />
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ListView.ItemContainerStyle>


button


1
2
3
4
5
6
7
8
9
10
11
12
13
14
 <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="Background" Value="Transparent"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type Button}">
                                <Border Background="{TemplateBinding Background}">
                                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
</Button.Style>


Posted by 동동(이재동)
wpf2017.09.06 12:13

예를 들면 3이라는 숫자가 바인딩 되어 있고

이걸 3개월로 바꾸고 싶으면 Converter를 쓰면 되지만 일일이 만들기가 엄청 귀찮다


 <TextBlock Text="{Binding Month, StringFormat={}{0}개월}"/>


돈도 

<TextBlock Text="{Binding Money,StringFormat='##,#'}" />


이렇게 하면 300,000 형식으로 나온다.



Posted by 동동(이재동)
wpf2017.08.22 12:41

물론 ViewModel에서는 MVVM Light 라이브러리에 있는 NotifyProperty가 알아서 해주겠지만


Model 같은경우는 자기가 만들면 된다.


에를 들면 ObservableCollection에서 어떤 Property를 수정하였을때 즉각적으로 바인딩된 UI에 적용하고 싶다면


Model에 INotifyPropertyChanged 인터페이스를 구축하면 된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    public class OrderedMenuItem : INotifyPropertyChanged
    {
        public int Index { get; set; }
 
        private int _orderCount;
 
        public int OrderCount
        {
            get { return _orderCount; }
            set
            {
                if (_orderCount != value)
                {
                    _orderCount = value;
                    NotifyPropertyChanged("OrderCount");
                }
            }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
 
        public void NotifyPropertyChanged(string propName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(thisnew PropertyChangedEventArgs(propName));
        }
    }


참고 : http://www.wpf-tutorial.com/data-binding/responding-to-changes/


Posted by 동동(이재동)
wpf2017.08.08 16:18

예를들어 View의 UserControl의 DataContext에 데이터를 주입하고

 <local:CardCancelControl DataContext="{Binding CardCancelData}" />


이런식으로...

유저컨트롤에서 버튼 커맨드를 넣었을때


 <Button Content="확인" Command="{Binding DataContext.CardCancelCommand}"  CommandParameter="Cancel" />


이런식으로 넣으면 안된다. datacontext안에 서 command를 호출하기 때문이다


이렇게 할려면 상위에서 DataContext를 빼야 작동한다.


그러면 상위에서 호출되게 할려면 어떻게 해야할까.


 <Button Content="확인" Command="{Binding Path=DataContext.CardCancelCommand,

                        RelativeSource={RelativeSource Mode=FindAncestor,

                        AncestorType={x:Type local:PopupControl}}}" CommandParameter="Cancel" />


이렇게 하면 된다.

참고 : https://stackoverflow.com/questions/3404707/access-parent-datacontext-from-datatemplate


Posted by 동동(이재동)
wpf2017.08.08 15:38

MvvmLight를 사용한다는 기준으로 작성한다.


1
2
3
4
        private void ExcuteSettingCommand()
        {
            MessengerInstance.Send(SettingEnum.OpenSettingPopup);
        }


MessngerInstance를 이용하여

일단 보내는 값을 object형태 (여기서는 enum)로 보낸다.


받는 ViewModel에서는


1
2
3
4
5
6
7
8
9
  public PopupViewModel()
        {
            MessengerInstance.Register<SettingEnum>(this, c => SettingExcute(c));
        }
 
        public void SettingExcute(SettingEnum result)
        {
            //some code
        }


이런식으로 등록하면 통신이 된다.

Posted by 동동(이재동)
wpf2017.08.07 11:29

일반적으로 Grid라든지 컨트롤들은 자동으로 해상도에 맞게 조절해주지만


이미지는 크기가 정해져 있어서 이미지 크기가 유동적으로 변하지 않는다.


그래서 만약 Grid를 사용할때 퍼센트를 이용해서 분할하였다면 이미지를 사용한 Row나 column은 이미지가 짤릴경우가 있다.


이럴때는 ViewBox로 그 Row를 감싸면 깔끔해진다.



Posted by 동동(이재동)
wpf2017.07.25 17:41

List는 List<ConvertOrderKey>이런식으로 자료가 들어가 있고


ItemTemplate안에는 

<Button Content="주문확인" Width="70" Command="{Binding ElementName=xListView, Path = DataContext.OrderClickCommand}" CommandParameter="{Binding}" />


이런식으로 구현하였다.

커맨드 파라미터는 그냥 ConvertOrderKey모델 전체를 넘겼다.


viewModel에서는


1
2
3
4
5
6
7
8
9
10
11
12
13
14
 private RelayCommand<ConvertOrderKey> _orderClickCommand;
 
        public RelayCommand<ConvertOrderKey> OrderClickCommand
        {
            get
            {
                return _orderClickCommand
                  ?? (_orderClickCommand = new RelayCommand<ConvertOrderKey>(
                    param =>
                    {
                        var temp = param;
                    }));
            }
        }

이렇게 구현하였다.

param에 모델데이터가 전부 넘어온다.


Posted by 동동(이재동)
wpf2017.07.24 15:03

List<Object Class> 의 리스트를 duplicate 해서 새로운 리스트를 만들고 그안에 object property를 수정하고 싶었다.


하지만 list를 duplicate 했더라도 안에 프로퍼티를 바꾸면 오리지널 데이터까지 바뀌어졌다.
그래서 해당 obejct class 에 ICloneable interface를 사용하여서 해결하였다.

이렇게 object에 interface를 선언하고

1
2
3
4
5
6
7
8
9

public class OrderItem : ICloneable
    {     
        public int GroupCount { get; set; }
 
        public object Clone()
        {
            return this.MemberwiseClone();
        }
    }

구현 하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static List<OrderItem> GroupOrderItemByName(List<OrderItem> orderList)
        {
            var groupOrderItemList = new List<OrderItem>();
            var result = orderList.GroupBy(s => s.Name).ToList();
 
            foreach (var item in result)
            {
                var orderItem = (OrderItem)item.ToList()[0].Clone();
                orderItem.GroupCount = item.Count();
                groupOrderItemList.Add(orderItem);
            }
            
             return groupOrderItemList;
         }


참고 : https://stackoverflow.com/questions/6569486/creating-a-copy-of-an-object-in-c-sharp



Posted by 동동(이재동)
wpf2017.07.21 15:51

소켓통신 하는도중 

Int형을 String형으로 받으면 

"1\u0018어쩌구저쩌구"

이런식으로 들어왔다.

이럴때 Non-Ascii를 제거하는 코드 이다..


1
2
3
String test = "스트링";
 
Regex.Replace(test, @"[^\u001F-\u007F]+"string.Empty);


제일 좋은건 그냥 Int는 Int형식으로 받는게 가장 깔끔하다..


어쩔수 없을때만 쓰자

참고 : https://stackoverflow.com/questions/123336/how-can-you-strip-non-ascii-characters-from-a-string-in-c



Posted by 동동(이재동)
wpf2017.07.21 15:13

내가 하고 싶었던거는


이렇게 BASE Model Class가 있고

1
2
3
4
5
public class OrderKey
    {
        public string nTempOrderID { get; set; }
        public string nOrderID { get; set; }
    }


OrderKey를 상속받는 클래스가 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ConvertOrderKey : OrderKey
    {
        public List<OrderItem> OrderItemList { get; set; }
 
        public void CopyFromBase(OrderKey orderKey)
        {
            // copy base class properties.
            foreach (PropertyInfo prop in orderKey.GetType().GetProperties())
            {
                PropertyInfo prop2 = orderKey.GetType().GetProperty(prop.Name);
                prop2.SetValue(this, prop.GetValue(orderKey, null), null);
            }
        }
    }

ConvertOrderKey는 OrderKey를 상속받고 추가로 List를 하나 더 추가하는것이였다.


CopyFromBase라는 메소드를 만들어서 단순히 orderkey에 있는 내용을 전부 클래스에 복사한다.

이렇게 하면


1
2
3
4
5
6
7
8
9
10
11
 public static void ConvertData(ObservableCollection<OrderKey> orderKey)
        {   
            var covertOrderKeyList = new ObservableCollection<ConvertOrderKey>();
            foreach (var item in orderKey)
            {
                ConvertOrderKey cok = new ConvertOrderKey();
                cok.CopyFromBase(item);
                cok.OrderItemList = new List<OrderItem>();
                covertOrderKeyList.Add(cok);
            }
        }
 

이런식으로 기존 Base 클래스 List안에 있는것들에 있는것들을 상속받은 Class로 Copy하고

추가로 OrderITemList값을 지정할수 있다.


참고 : https://social.msdn.microsoft.com/Forums/vstudio/en-US/2105f08f-50ce-47a3-8e2a-3e62634d4cbc/copy-properties-from-base-class-to-derived-class-without-manually-mapping-them?forum=csharpgeneral

Posted by 동동(이재동)
wpf2017.07.18 16:43

보통 기본 리스트박스로 만들면 이렇게 item 이 들어간다.


enter image description here


만약 

enter image description here


이렇게 하고 싶다면

<ListBox>
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>


출처 : https://stackoverflow.com/questions/20934261/align-grid-column-to-right

Posted by 동동(이재동)
wpf2017.07.17 16:58

Grid 같은 패널에 Add,Clear 하면서 임시로 nagiation처럼 되도록 하는 방법이 있지만


Frame을 이용하면 더 깔끔하게 가능하다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public static class NavigationManager
    {
        private static Frame _mainContentFrame;
 
        public static void SetFrame(Frame frame)
        {
            _mainContentFrame = frame;
        }
 
        public static void Navigate(UserControl page)
        {
            _mainContentFrame.Navigate(page);
        }
    }


Xaml


1
2
3
<Grid x:Name="xMainWindowPanel">
        <Frame x:Name="xMainFrame" NavigationUIVisibility="Hidden" />
</Grid>


사용법


1
2
3
4
5
  private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            NavigationManager.SetFrame(xMainFrame);
            xMainFrame.Navigate(new LoginPage());
        }

추가...

naviagte를 하게 되면 이전 페이지가 필요 있으면 메모리에 남게 되므로 메모리 관리에 문제가 있을수 있다.

 public static void Navigate(UserControl page)
        {
            _mainContentFrame.Navigate(page);

            while (_mainContentFrame.CanGoBack == true)
            {
                _mainContentFrame.RemoveBackEntry();
            }
        }

RemoveBackEntry()로 지워주자


'wpf' 카테고리의 다른 글

Base 모델 클래스에 있는 데이터를 상속 클래스에 COPY 하기  (0) 2017.07.21
listbox에서 오른쪽 정렬하고 싶을때  (0) 2017.07.18
[WPF] NavagionManager  (0) 2017.07.17
MVVM Button Click Command 사용법  (0) 2017.07.17
MVVM을 쓰면서...  (3) 2016.10.24
바인딩이란?  (0) 2016.10.24
Posted by 동동(이재동)
wpf2017.07.17 16:54

일단 Command를 만든다.

1
2
        private bool _deleteCommand = true;
        public RelayCommand DeleteCommand { get; private set; }
 


ViewModel 생성자에 넣기

1
2
3
4
5
 public MainViewModel()
        {
            DeleteCommand = new RelayCommand(ExcuteDeleteCommand, () => _deleteCommand);
            OrderMenuList = new ObservableCollection<OrderMenu>();
        }



1
2
3
4
 private void ExcuteDeleteCommand()
        {
            OrderMenuList.RemoveAt(OrderMenuList.Count - 1);
        }


xaml코드에는


1
<Button x:Name="xdelete" Content="삭제"  Height="50" Margin="20" Command="{Binding DeleteCommand}" />


여러가지 파라미터를 사용하고 싶으면 여기 참고

https://msdn.microsoft.com/en-us/magazine/dn237302.aspx

'wpf' 카테고리의 다른 글

listbox에서 오른쪽 정렬하고 싶을때  (0) 2017.07.18
[WPF] NavagionManager  (0) 2017.07.17
MVVM Button Click Command 사용법  (0) 2017.07.17
MVVM을 쓰면서...  (3) 2016.10.24
바인딩이란?  (0) 2016.10.24
반복적인 xaml name 을 이용할때  (0) 2016.09.23
Posted by 동동(이재동)
wpf2016.10.24 15:37

6년동안 MVVM을 쓰면서.. 느낀점을 알아보자..


일단 MVVM이란


Model : 보통 Data를 담는 그릇정도로 생각

View :  디스플레이 사용자가 보여지는것, UI, 디자이너의 영역이라고 정의해두자.

ViewMode: View의 표현을 담당한다고 보면 된다. 보통 View에 Data를 표현해준다.  

보통 ViewModel이 변경되면 View에 자동으로 업데이트 하는 방식으로 구현된다.


MVVM을 사용했을때 장점은 머가 있었을까...

-일단 View와 비지니스 로직의 연결이다. 뷰나 비지니스 로직 둘중에 하나가 변경 되더라도 다른 부분에 영향을 미치지 않는다. 따라서 디자이너와의 협업 시스템이 정말 용의 하다. 실제로 디자이너랑 엄청 편리하게 작업을 해왔다.


-ICommand의 각종 이벤트나 익터렉션 처리를 ICommand를 호출해서 사용하는데 간단하게 이야기 하면

이벤트를 뷰모델과 연결하는 방법이다. 근데 은근히 귀찮고 짜증나서 사용하기가 싫다. 그냥 BeHind로 하고 싶다!!!!!


-Binding 사용가능

등등


장점만 있는거 같지만 단점도 많다..


가장 중요한 귀찮다!! 귀찮다!! 귀찮다!

페이지 하나 만들려고 해도 VIewModel을 따로 만들어야 하니 귀찮니즘땜에 죽겠다.

그리고 이벤트 연결 그냥 비하인드에 해도 되는데 ICommmand 쓰면 코드가 몇줄이나 늘어난다.

그리고 디버깅도 더 힘들다.

그리고 View처리가 복잡해지면 ViewModel Class가 엄청나게 커진다.


이렇게 장단점이 있기때문에 상황에 맞게 잘사용해야할꺼 같다..

무조건 MVVM을 고집하는건 좀 아닌거 같다는 생각이 든다.












'wpf' 카테고리의 다른 글

[WPF] NavagionManager  (0) 2017.07.17
MVVM Button Click Command 사용법  (0) 2017.07.17
MVVM을 쓰면서...  (3) 2016.10.24
바인딩이란?  (0) 2016.10.24
반복적인 xaml name 을 이용할때  (0) 2016.09.23
[WPF] ListBox Selected 되었을때 내용 바꾸기  (0) 2016.09.08
Posted by 동동(이재동)
wpf2016.10.24 15:23

WPF 기준으로 바인딩이란

XAML로 표현되는 UI 요소와 ViewModel로 표현되는 데이터 사이에 관계를 맺는 기술을 의미한다.


이를 통해서 UI부분과 데이터 부분을 서로 독립적으로 다를수 있으며 이것은 곧 UI디자이너와 개발자의 역활을 보다 분명하게 정의하고 협업에 효율적으로 할수 있게한다.

'wpf' 카테고리의 다른 글

MVVM Button Click Command 사용법  (0) 2017.07.17
MVVM을 쓰면서...  (3) 2016.10.24
바인딩이란?  (0) 2016.10.24
반복적인 xaml name 을 이용할때  (0) 2016.09.23
[WPF] ListBox Selected 되었을때 내용 바꾸기  (0) 2016.09.08
Drag and Drop Cursor (커서) 변경  (0) 2016.08.23
Posted by 동동(이재동)
wpf2016.09.23 10:47

예를 들면 xaml에서


<border x:name="border1" />

<border x:name="border2" />


이렇게 있다고 하면 behind에서 힘들게 이름을 찾지 말고


var temp = (Border)this.FindName("border1");


요렇게 하면 된다.


'wpf' 카테고리의 다른 글

MVVM을 쓰면서...  (3) 2016.10.24
바인딩이란?  (0) 2016.10.24
반복적인 xaml name 을 이용할때  (0) 2016.09.23
[WPF] ListBox Selected 되었을때 내용 바꾸기  (0) 2016.09.08
Drag and Drop Cursor (커서) 변경  (0) 2016.08.23
ListBox Drag and Drop  (0) 2016.08.23
Posted by 동동(이재동)
wpf2016.09.08 18:04
<s:SurfaceListBox x:Name="xListbox" >
<s:SurfaceListBox.ItemTemplate>
<DataTemplate>
<Grid>
<StackPanel>
<TextBlock Text="1057-1966" x:Name="xYearTextBlock" />
<TextBlock Text="약국에서 시작될꿈 제약으로 " />
</StackPanel>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Value="True" Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}">
<Setter TargetName="xYearTextBlock" Property="Text" Value="HotPink" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</s:SurfaceListBox.ItemTemplate>
</s:SurfaceListBox>



<DataTrigger Value="True" Binding="{Binding IsSelected, ElementName=xListbox}">

이런식으로 elementname으로도 가능하다

DateTemplte 안에 Triggers를 이용하면 아주 간단하게 된다. 이예제는 DataTemple에 있는 xYearTextBlock Text를 바꾼것이다.

간단한 배경이나 글자 컬러정도는 컨테이너 스타일로도 바꿀수 있다.

<UserControl.Resources>
<Style x:Key="myLBStyle" TargetType="{x:Type ListBoxItem}">
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border
Name="Border"
Padding="2"
SnapsToDevicePixels="true">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="Border" Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="Red" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>


'wpf' 카테고리의 다른 글

바인딩이란?  (0) 2016.10.24
반복적인 xaml name 을 이용할때  (0) 2016.09.23
[WPF] ListBox Selected 되었을때 내용 바꾸기  (0) 2016.09.08
Drag and Drop Cursor (커서) 변경  (0) 2016.08.23
ListBox Drag and Drop  (0) 2016.08.23
app.config 수정 edit  (0) 2016.07.15
Posted by 동동(이재동)
wpf2016.08.23 17:22

-일반적인 cur 파일로 변경방법


private void Label_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DataObject data = new DataObject(DataFormats.Text, ((Label)e.Source).Content);
DragDrop.DoDragDrop((DependencyObject)e.Source, data, DragDropEffects.Copy);
}
private void Label_Drop(object sender, DragEventArgs e)
{
((Label)e.Source).Content = (string)e.Data.GetData(DataFormats.Text);
}
private Cursor customCursor = null;
private void Label_GiveFeedback(object sender, GiveFeedbackEventArgs e)
{
if (e.Effects == DragDropEffects.Copy)
{
if (customCursor == null)
customCursor = new Cursor(new FileStream("Earth.cur", FileMode.Open));
e.UseDefaultCursors = false;
Mouse.SetCursor(customCursor);
}
else
e.UseDefaultCursors = true;
e.Handled = true;
}

-UserControl(UI Element)로 바꾸는 방법

namespace VISION.IdeaParkinglot.Managers
{
public class CursorManager
{
private static class NativeMethods
{
public struct IconInfo
{
public bool fIcon;
public int xHotspot;
public int yHotspot;
public IntPtr hbmMask;
public IntPtr hbmColor;
}
[DllImport("user32.dll")]
public static extern SafeIconHandle CreateIconIndirect(ref IconInfo icon);
[DllImport("user32.dll")]
public static extern bool DestroyIcon(IntPtr hIcon);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);
}
[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
private class SafeIconHandle : SafeHandleZeroOrMinusOneIsInvalid
{
public SafeIconHandle()
: base(true)
{
}
override protected bool ReleaseHandle()
{
return NativeMethods.DestroyIcon(handle);
}
}
private static Cursor InternalCreateCursor(System.Drawing.Bitmap bmp)
{
var iconInfo = new NativeMethods.IconInfo();
NativeMethods.GetIconInfo(bmp.GetHicon(), ref iconInfo);
iconInfo.xHotspot = 0;
iconInfo.yHotspot = 0;
iconInfo.fIcon = false;
SafeIconHandle cursorHandle = NativeMethods.CreateIconIndirect(ref iconInfo);
return CursorInteropHelper.Create(cursorHandle);
}
public static Cursor CreateCursor(UIElement element)
{
element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
element.Arrange(new Rect(new Point(), element.DesiredSize));
RenderTargetBitmap rtb =
new RenderTargetBitmap(
(int)element.DesiredSize.Width,
(int)element.DesiredSize.Height,
96, 96, PixelFormats.Pbgra32);
rtb.Render(element);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(rtb));
using (var ms = new MemoryStream())
{
encoder.Save(ms);
using (var bmp = new System.Drawing.Bitmap(ms))
{
return InternalCreateCursor(bmp);
}
}
}
}
}

요기는 giveFeedBack에 쓸것
private void Label_GiveFeedback(object sender, GiveFeedbackEventArgs e)
{
if (e.Effects == DragDropEffects.Copy)
{
if (customCursor == null)
customCursor = CursorHelper.CreateCursor(e.Source as UIElement);
if (customCursor != null)
{
e.UseDefaultCursors = false;
Mouse.SetCursor(customCursor);
}
}
else
e.UseDefaultCursors = true;
e.Handled = true;
}





참고 : https://wpf.2000things.com/2012/12/17/713-setting-the-cursor-to-an-image-of-an-uielement-while-dragging/









'wpf' 카테고리의 다른 글

반복적인 xaml name 을 이용할때  (0) 2016.09.23
[WPF] ListBox Selected 되었을때 내용 바꾸기  (0) 2016.09.08
Drag and Drop Cursor (커서) 변경  (0) 2016.08.23
ListBox Drag and Drop  (0) 2016.08.23
app.config 수정 edit  (0) 2016.07.15
[WPF] IsolatedStorageManager  (0) 2016.06.08
Posted by 동동(이재동)
wpf2016.08.23 15:41

일단 참고


http://www.c-sharpcorner.com/uploadfile/dpatra/drag-and-drop-item-in-listbox-in-wpf/



'wpf' 카테고리의 다른 글

[WPF] ListBox Selected 되었을때 내용 바꾸기  (0) 2016.09.08
Drag and Drop Cursor (커서) 변경  (0) 2016.08.23
ListBox Drag and Drop  (0) 2016.08.23
app.config 수정 edit  (0) 2016.07.15
[WPF] IsolatedStorageManager  (0) 2016.06.08
프로그램 죽을때 바로 재시작하게 하기  (0) 2016.05.19
Posted by 동동(이재동)
wpf2016.07.15 12:44
private static void UpdateSetting(string key, string value)
{
Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
configuration.AppSettings.Settings[key].Value = value;
configuration.Save();
ConfigurationManager.RefreshSection("appSettings");
}



Posted by 동동(이재동)
wpf2016.06.08 15:28
public static class IsolatedStorageManager
{
public static void Save(string text)
{
IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForAssembly();
StreamWriter srWriter = new StreamWriter(new IsolatedStorageFileStream("path", FileMode.Create, isolatedStorage));
srWriter.WriteLine(text);
srWriter.Flush();
srWriter.Close();
}
public static string Load()
{
IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForAssembly();
StreamReader srReader = new StreamReader(new IsolatedStorageFileStream("path", FileMode.OpenOrCreate, isolatedStorage));
if (srReader != null)
{
while (!srReader.EndOfStream)
{
string item = srReader.ReadLine();
srReader.Close();
return item;
}
}
srReader.Close();
return @"C:\movie";
}
}


















Posted by 동동(이재동)
wpf2016.05.19 14:46

전시회에서 프로그램이 죽어서 꺼지게 되면 난감하다.


그걸 방지하기 위한 꼼수로 프로그램을 잘짜면 죽지는 않겠지만


간혹가다 생기는 메모리 누수및 관리로 인해 프로그램이 죽을때도 있기에 안정장치로 설정할 수 있다.


app.xaml.cs 에서


this.DispatcherUnhandledException += App_DispatcherUnhandledException;


 private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)

        {

            Thread.Sleep(1000);

            System.Windows.Forms.Application.Restart();

            Thread.Sleep(1000);

            Process.GetCurrentProcess().Kill();

        }


컴퓨터가 빠를경우 sleep을 사용할필요가 없는데 느린경우가 있어서 썼다.

Posted by 동동(이재동)
wpf2016.04.25 13:36

이상하게 ListBox에서 Item끝으로 터치하면 프로젝트 화면 전체가 움직였다.


여러가지 실험을 해본 결과 


xMakeupListPanel.ManipulationBoundaryFeedback += XMakeupListPanel_ManipulationBoundaryFeedback;
private void XMakeupListPanel_ManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e)
{
e.Handled = true;
}

이렇게 해결 하였다..

참고 : http://stackoverflow.com/questions/4505772/wpf-listbox-with-touch-inertia-pulls-down-entire-window


Posted by 동동(이재동)
wpf2016.04.25 11:26

사운드 파일  실행


SoundPlayer sp = new SoundPlayer(Resources.Click);
sp.Play();


해당 프로젝트 Resources.resx에서 상단에 리소스 추가 버튼을 누른후 wav파일을 등록후 사용한다~


Posted by 동동(이재동)
wpf2016.04.21 17:47

DesignerProperties.GetIsInDesignMode(this)



출처 : http://www.stievens-corner.be/index.php/10-wpf/47-designerproperties-getisindesignmode

Posted by 동동(이재동)
wpf2016.04.19 13:24

Bitmap 이미지 프로세싱을 이용하여 흑백, 세피아톤, 반전, 투명, 만화 등의 효과를 사용할 수 있다...


C#에 있는 샘플 코드를  WPF에서 사용할수 있도록 바꾸었다.



필터가 추가 될때마다 소스를 업데이트 하겠다.


참고한 사이트 : https://softwarebydefault.com/2013/03/02/bitmap-image-filters/



ImageFilterTest.zip




조금더 추가한 버전(blur,, 가우시안블러,FuzzEdgeBlur)


ImageFilterTest.zip







'wpf' 카테고리의 다른 글

SoundPlayer 사용  (0) 2016.04.25
blend 디자인모드 무시  (0) 2016.04.21
Image Filter 사용하기 (이미지 프로세싱)  (0) 2016.04.19
WPF HtmlToXaml에 Image Add하기  (0) 2016.04.14
image sequence 만들기 (Image Animation)  (0) 2016.04.08
parent usercontrol Owner 상위 찾기  (0) 2016.04.08
Posted by 동동(이재동)
TAG Filter, image, WPF