본문 바로가기

wpf

Access BitmapSource Pixel Data (WIC Image Hack) Introduction WPF에서 파일로부터 불러온 이미지의 픽셀데이터에 접근하고자 할 경우 아래와 같이 CopyPixels를 통해 이미지에 포함된 픽셀 값들을 복사하는 방법을 사용합니다. CopyPixels는 이름에서도 알 수 있듯이 이미지에 있는 픽셀데이터를 복사하는데요, 이 때문에 데이터의 용도가 단순한 읽기 전용이거나 업데이트를 위한 용도일 경우에는 불필요한 메모리와 퍼포먼스를 요구하게 되므로 효율적이지 못합니다. byte[] Pixels = new byte[CopyPixelsSource.PixelHeight * CopyPixelsSource.BackBufferStride]; OriginalSource.CopyPixels(Pixels, CopyPixelsSource.BackBufferStride,.. 더보기
WPF Window Resizer(Attached Property) Introduction WPF를 이용해 Application을 개발 할 때 기본 Window모양이 아닌 임의의 디자인의 Window로 구현해야 하는 경우가 있습니다. 이때 아래 그림과 같이 WindowStyle 속성과 AllowsTransparency 속성을 이용해 기본 Frame을 나타나지 않도록 구현 할 수 있는데요. WindowStyle을 None으로 설정할 경우 기본 제목 표시줄을 사라지지만 윈도우의 테두리에 크기를 변경할 때 사용하는 테두리가 남아 있는데요. 이를 제거하기 위해서 AllowsTransparency 속성을 True 지정하면 이 테두리가 사라지게 됩니다. 그런데, 한가지 문제점은 AllowsTransparency 속성이 True일 경우에는 기본적으로 마우스를 이용해 크기조절이 불가능.. 더보기
Geometry Padding Extension Introduction WPF에서 Geometry를 이용해 도형을 그릴때 테두리를 그리기 위해 아래와 같이 Stroke를 이용해 도형을 그립니다. 그런데 Stroke를 이용해 테두리를 그릴때 Stroke가 하나가 아니고 두개 이상을 그려야 하는 경우 문제가 발생합니다. 정 N각형의 경우 간한히 크기가 작은 도형을 한번 더 그려서 Stroke를 두개 이상 생성하는게 가능하지만, 임의의 모양의 도형일 경우에는 아래 그림과 같이 단순히 크기 조절만으로는 Stroke와 같은 효과를 낼 수 가 없습니다. 정 N각 형이 아닐 경우 직접 Path Data의 위치를 수정하거나 다시 그려야 하는데 간단한 모양일 경우에는 한두번정도 해보겠지만, 모양이 복잡해질 수록 정확도는 떨어지고 시간도 오래걸리게 됩니다. 이번시간에는.. 더보기
ScrollViewer Zoom And Panning Behavior Introduction 일반적으로 Image Viewer 등과 같이 화면에 출력해야할 내용이 화면크기보다 클 경우 ScrollViewer를 이용해 내용을 스크롤할 수 있도록 구현을 하는데요, 이번시간에는 화면을 스크롤하기 위해서 스크롤바를 조작하지 않고 간단한 마우스조작으로 컨텐츠를 직접 드래그하는 방식으로 View를 조절하고 확대 축소할 수 있는 기능을 구현해보았습니다. 아래는 이번시간에 구현한 결과물 영상입니다. Create ZoomAndPanning Behavior Zoom 또는 Panning의 경우 자주 사용될 수 있는 기능이기 때문에 재사용을 용이하게 하기 위해서 Behavior의 형태로 작성했습니다. ZoomAndPanning Behavior의 기본적인 구성은 와래와 같습니다. public c.. 더보기
ListBox(ListView) DeferredScrolling Preview Introduction ListBox나 Listview와 같이 목록형으로 데이터를 출력하는 컨트롤에서 많은 양의 데이터를 출력할경우, 스크롤 바를 조작할때 스크롤 속도가 매우 느려지는 현상을 발생합니다. 속도가 느려지는 가장큰 원인은 스크롤하는 도중에 매번 화면에 출력될 View가 업데이트되면서 퍼포먼스에 영향을 주게 되는것인데, 이를 해결하기 위한 간단한 방법으로 ScrollViewer의 IsDeferredScrollingEnabled 속성을 이용해 스크롤이 모두 끝났을때 View를 갱신하는 방법이 있습니다. 하지만 IsDeferredScrollingEnabled을 사용 할 경우 스크롤 동작이 완료될때까지 뷰가 갱신되지 않기때문에 디테일한 탐색이 불가능하기 때문에 오히려 더 불편한 상황이 발생 할 수도.. 더보기