본문 바로가기

전체 글

(96)
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..
Nuget :: isfry.Wpf 1.0.0.8 isfry.Wpf 1.0.0.8 (https://www.nuget.org/packages/isfry.Wpf) - Bug Fixes
Service Project 를 쉽게 디버깅하기 Service Project를 만들고 디버깅을 하려고 하면 참 번거롭다. 우선 Visual Studio에서 실행이 안된다. 그래서 이것저것 번거로운 방법들이 있지만, 그나마 조~~금 덜 번거로운 방법으로.... 닷넷에 보면 1System.Diagnostics.Debugger.Launch();cs 라는 것이 있고 아래와 같이 설명하고 있다. 원하는 위치에 해당 Debugger.Launch(); 를 끼워 넣고 빌드 후, 만든 서비스를 등록하고 시작을 하면 해당 위치에 자동으로 Breakpoint로 잡히게 된다. 단, 해당 소스를 Visaul Studio 관리자 모드로 실행시켜놓은 상태여야 한다.
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(); 적은 양의 이미지를 로드할 때는 별문제가 발생하지 않겠지만다량의 많은 양의 이미지를 로드할 때, 심각한 문제를 야기할 수 있다. 만약 로드한 이미지를 표시할 때, 원본 이미지의 사이즈로 보여주는 것이 아니라 썸네일로 보여줄 때는원본의 사이즈가 아니라 필요한 만큼의 사이즈로 읽어 들이는 것이 더 효과적일 것이다. 적당한 사이즈를 알고..