본문 바로가기

Dev::DotNet/WPF

(23)
BitmapSource 이미지 일부 잘라내기 123456789101112131415161718192021public BitmapSource CropImage(BitmapSource aImage, Rect aCropRect){ if (aImage == null) throw new ArgumentNullException("Image"); var rect = new Rect(0, 0, aImage.PixelWidth, aImage.PixelHeight); if (!rect.IntersectsWith(aCropRect)) throw new ArgumentOutOfRangeException("Crop Rect"); rect.Intersect(aCropRect); return new CroppedBitmap( aImage, new Int32Rect( (int..
DependencyPropertyDescriptor 사용시 주의사항 - Memory leak WPF 의 DependencyProperty 의 값 변경에 대해서 통지를 받고 싶으면 DependencyPropertyDescriptor 를 통해서 쉽게 할 수 있다. WPF 에서 사용되는 컨트롤은 DependencyObject 를 상속받았고 많은 속성을 DependencyProperty 로 정의되어 있다. 그렇기 때문에 Property 의 값이 변경되었을 때, 통지를 받을 수 있는 DependencyPropertyDescriptor 는 매우 유용하게 사용할 수 있다. 컨트롤에서 제공해주는 이벤트뿐만 아니라 단순 Property 의 상태변화까지도 통지를 받아서 처리할 수 있으니까 말이다. DependencyPropertyDescriptor 를 획득하고 AddValueChanged 를 통해서 대상 객체와 ..
TextBox 에 2바이트 문자 입력중 삭제시 Caret 문제 WPF 의 TextBox에서 2바이트 문자 (double-byte character) 입력시, 이런저런 문제가 발생한다.(Winform TextBox에서는 발생하지 않는 문제이기 때문에 WPF TextBox 의 문제라는 생각함) 엔터를 쳐서 새로운 라인을 삽입하고 바로 2바이트 문자를 입력하다가 Backspace로 삭제를 하면 TextBox 의 Caret 이 윗줄 맨 뒤에서 깜빡이고 있다는 것이다.더 웃긴 건 거기서 다시 입력을 하면 다시 원래 위치인 아래 줄에서 입력이 시작된다.만약 엔터를 친다면 현재 Caret 이 위치한 라인의 아래 아래 줄로 내려가 버린다. 또한 2바이트 문자인 한글, 일본어에 따라서도 Caret 이 잘못 움직이는 것도 서로 다르게 움직인다. 문제를 해결하기 위해서는 우선 12te..
WebBrowser Control Zoom 조절 일반적으로 사용하는 웹브라우져에서 확대/축소를 할 수 있고 WPF 의 WebBrowser 컨트롤에서도 확대/축소를 할 수 있지만 WebBrowser 에서 기본적으로 제공하지는 않는 것 같다. Zoom 을 강제적으로 지정하기 위해서는 SHDocVw 참조가 필요하여 아래와 같이 하면 된다. (참조 관리자 -> Com -> Microsoft Internet Controls) 123456789101112131415161718192021222324void SetZoom(System.Windows.Controls.WebBrowser aBrowser, double aZoomFactor){ if (aBrowser != null) { if (aBrowser != null) { FieldInfo webBrowserInfo..
Window 를 특정 Thread 에서 위임하는 법 UI 의 변경은 보통 주 Thread에서 가능하고 다른 Thread에서 UI 의 변경은 invoke를 통해서 하게 된다. WPF 의 경우도 다르지 않다. 하지만 특정 Window를 주 Thread가 아닌 별도 생성한 Thread에 아예 위임해버릴 수도 있다. (보통 이렇게 사용할 경우는 없겠지만...) Thread thread = new Thread(() => { Window myWnd = new MyWindow(); myWnd .Closed += (sender, e) => myWnd.Dispatcher.InvokeShutdown(); System.Windows.Threading.Dispatcher.Run(); }); thread.SetApartmentState(ApartmentState.STA); th..
WPF 에서 Image 파일 로드시 속도 / 메모리 관련 소소한 Tip WPF에서 이미지 파일 로드시 보통 다음과 같은 방법을 흔히 사용한다.var image = new BitmapImage(); image.BeginInit(); image.UriSource = new Uri("d:\test.jpg", UriKind.Absolute); image.CacheOption = BitmapCacheOption.OnLoad; image.EndInit(); 적은 양의 이미지를 로드할 때는 별문제가 발생하지 않겠지만다량의 많은 양의 이미지를 로드할 때, 심각한 문제를 야기할 수 있다. 만약 로드한 이미지를 표시할 때, 원본 이미지의 사이즈로 보여주는 것이 아니라 썸네일로 보여줄 때는원본의 사이즈가 아니라 필요한 만큼의 사이즈로 읽어 들이는 것이 더 효과적일 것이다. 적당한 사이즈를 알고..
WPF Data Binding Error 처리 WPF를 하다 보면 Binding 에러는 흔히 발생한다. 하지만 Binding 에러는 Binding 내부에서 Exception을 처리하기 때문에 에러가 났을 때 알아차리기가 쉽지 않다. 더군다나 Binding 한 Property에 로직이 들어가 있는 경우 해당 부분에서 발생한 Exception 또한 Binding 내부에서 처리해버리기 때문에 Unhandled Exception 으로도 떨어지지 않는다. 그래서 명확하게 Binding 에러를 파악하고 싶을 때, PresentationTraceSource 의 DataBindingSource 에 Listener 를 설치하여 메시지를 받아올 수 있다. >> Detecting Binding Errors 아마 Listener 를 설치하고 실행시켜보고 생각지도 않은 많..
Hardcodet.NotifyIcon.Wpf 의 MessageBox? WPF 에서 NotifyIcon 을 사용해야 할 때, Nuget 에 찾아보면 Hardcodet.NotifyIcon.Wpf 라는 것이 나온다. 이걸 통해서 쉽게 NotifyIcon 을 사용할 수 있다. 헌데...여기에 Command 를 Binding 하여 MessageBox 를 사용 할 때, 그냥 MessageBox 가 그냥 떴다가 사라져 버리는 문제가 있는 것 (?) 같다. 이것의 문제가 Hardcodet.NotifyIcon.Wpf 인지는 정확하지 않지만.. 이런저런 테스트 결과...잠정적으로 Hardcodet.NotifyIcon.Wpf 의 문제라는 결론을 내렸다. NotifyIcon 도 써야하고 MessageBox 도 써야하는데...어떻게 해야하나?ㅡ,.ㅡ MessageBox.Show 에 owner 를..