반응형

프로그래밍/WPF 52

[WPF] 이벤트: PreviewMouseDown과 MouseDown의 차이

WPF에서 마우스 이벤트는 두 가지 주요 유형으로 나뉩니다: PreviewMouseDown과 MouseDown. 이 두 이벤트는 이벤트 라우팅 방식에서 중요한 차이를 가지고 있습니다. 이번 포스트에서는 이 두 이벤트의 차이점과 실행 순서를 살펴보겠습니다. 이벤트 라우팅 방식1. PreviewMouseDown:터널링 단계에서 발생합니다. 즉, 이벤트가 부모 요소에서 자식 요소로 전파됩니다.2. MouseDown:버블링 단계에서 발생합니다. 즉, 이벤트가 자식 요소에서 부모 요소로 전파됩니다. 실행 순서이벤트가 발생할 때의 실행 순서는 다음과 같습니다:부모 PreviewMouseDown ↓자식 PreviewMouseDown ↓자식 MouseDown ↓부모 MouseDown 예제 코..

프로그래밍/WPF 2024.11.18

[WPF] DataGrid 가상화와 ComboBox SelectedItem 불일치 문제 해결: MVVM 패턴에서의 효율적인 접근 방법

WPF(Windows Presentation Foundation)에서 DataGrid는 대량의 데이터를 효율적으로 표시하기 위한 강력한 컨트롤입니다. 그러나 가상화(Virtualization)를 사용할 때 ComboBox와 같은 편집 컨트롤을 포함하면 예상치 못한 문제가 발생할 수 있습니다. 특히, MVVM 패턴을 사용하는 경우에는 이러한 문제가 더욱 복잡해질 수 있습니다. 이번 글에서는 DataGrid의 가상화로 인해 발생하는 ComboBox의 SelectedItem 불일치 문제를 분석하고, MVVM 패턴을 유지하면서 이를 해결하는 방법을 소개하겠습니다. 문제 상황DataGrid에 가상화를 적용하고 각 행(Row)에 ComboBox를 포함시켰을 때, SelectedIndex가 -1인 경우 ComboBo..

프로그래밍/WPF 2024.10.15

[WPF] DataGrid 행 더블 클릭 시 Command 실행하기

WPF에서 MVVM 패턴을 사용하는 경우, DataGrid의 행을 더블 클릭할 때 특정 Command를 실행하고자 할 수 있습니다. 이 작업을 수행하기 위해서는 Interaction.Behaviors를 활용하는 것이 일반적입니다. 오늘은 DataGrid 행 더블 클릭에 Command를 연결하고 CommandParameter로 선택된 행의 아이템을 전달하는 방법을 살펴보겠습니다. 1단계: Behavior 클래스 생성 먼저, 행 더블 클릭 시 실행할 Behavior 클래스를 생성해야 합니다. 이 클래스는 System.Windows.Interactivity.Behavior를 상속받아야 합니다. 그리고 Command와 CommandParameter를 DependencyProperty로 선언하여, XAML에서 B..

프로그래밍/WPF 2023.11.03

[WPF] HelixToolkit.Wpf.SharpDX 사용하여 3D 공간에서 마우스 드래그로 선택 영역 그리기

3D 모델링 및 시각화 툴을 개발하다 보면 사용자가 마우스로 드래그하여 특정 영역을 선택하는 기능을 구현할 필요가 종종 있습니다. 이번 글에서는 WPF와 HelixToolkit.Wpf.SharpDX를 사용하여 3D 공간에서 마우스 드래그로 선택 영역을 그리는 방법에 대해 알아보겠습니다. 개요 사용자가 마우스 왼쪽 버튼을 클릭하고 드래그하면, 그림자 박스 형태로 선택 영역을 화면에 표시합니다. 이 기능은 3D 모델링 툴에서 객체를 선택하거나, 특정 영역에 대한 작업을 수행할 때 유용하게 사용됩니다. 준비 먼저, WPF 프로젝트를 생성하고, NuGet 패키지 관리자를 통해 HelixToolkit.Wpf.SharpDX를 설치합니다. 코드 구현 디자인 필드 정의 private Vector3 startDragPo..

프로그래밍/WPF 2023.10.30

[WPF] Slider 드래그 완료 시점에 값 업데이트하기

안녕하세요, 오늘은 WPF에서 Slider의 Value를 사용자가 드래그를 완료한 순간에만 업데이트하는 방법에 대해 이야기하려 합니다. 일반적으로 WPF에서는 사용자가 Slider를 드래그하는 동안 실시간으로 값을 업데이트하지만, 이 방법을 사용하면 드래그가 완료된 후에만 업데이트가 이루어집니다. 먼저, 어떤 문제를 해결하려는가? Slider를 사용하면 사용자는 원하는 값을 직접 조절할 수 있습니다. 이때 Slider의 Value를 어떤 속성에 바인딩하면, 사용자가 슬라이더를 드래그하면서 속성 값이 실시간으로 업데이트됩니다. 이런 실시간 업데이트가 문제가 될 수 있습니다. 왜냐하면 슬라이더를 움직이는 동안에도 바인딩된 속성의 값이 계속 변경되면서 원치 않는 연산이나 UI 업데이트가 발생할 수 있기 때문입..

프로그래밍/WPF 2023.07.26

[WPF] Data Binding에서 StringFormat 사용하기

WPF의 데이터 바인딩 기능은 UI의 속성을 데이터 소스에 직접 바인딩할 수 있게 해줍니다. 그리고 StringFormat을 사용하면 이러한 데이터를 원하는 형식으로 출력할 수 있습니다. 이번 글에서는 어떻게 StringFormat을 사용하는지, 그리고 다양한 표현 방법에 대해 알아보겠습니다. 기본 사용 방법 먼저 가장 기본적인 사용 방법은 다음과 같습니다. 이 경우, {Binding Path=YourProperty}가 사용되며 여기서 YourProperty는 바인딩하려는 속스의 프로퍼티 이름입니다. StringFormat 사용하기 그런데 경우에 따라서는 데이터를 특정한 형식으로 표현하고 싶을 수 있습니다. 이럴 때는 StringFormat을 사용합니다. 예를 들어, 소수점 아래 세 자리까지의 실수를 표..

프로그래밍/WPF 2023.07.25

[WPF] DataGrid DataGridTemplateColumn 사용시 Ctrl+C (복사하기) 기능

안녕하세요, 오늘은 WPF의 DataGrid에서 DataGridTemplateColumn을 사용하면서 Ctrl+C로 셀의 내용을 복사하는 방법에 대해 이야기하려고 합니다. 복사하는 기능은 기본적으로 제공되지만, DataGridTemplateColumn을 사용하면 기본 설정이 작동하지 않을 수 있습니다. 이럴 때에는 ClipboardContentBinding 속성을 사용하면 해결할 수 있습니다. ClipboardContentBinding 속성이란? WPF의 DataGrid 컨트롤에서는 ClipboardContentBinding이라는 속성을 통해 셀의 내용이 클립보드에 어떻게 복사되는지 제어할 수 있습니다. 기본적으로 각 DataGridColumn에는 이 속성이 있으며, 해당 열의 셀이 클립보드에 복사될 때..

프로그래밍/WPF 2023.05.22

[WPF] 여러 Enum 상태에 따라 선택적으로 UserControl 표시하기

WPF에서 사용자 인터페이스를 개발하다 보면, 여러 상황에 따라 다양한 UserControl을 동적으로 표시해야 할 때가 있습니다. 이런 경우, Enum 상태에 따라 UserControl을 선택적으로 표시하는 방법을 사용할 수 있습니다. 이 이번 포스팅에서는 DataTemplate 및 DataTemplateSelector를 사용하여 여러 Enum 상태에 따라 UserControl을 표시하는 방법을 알아봅니다. 1. Enum 정의 public enum Status { First, Second, Third } 2. 각 상태에 대한 UserControl 정의 예를 들어, FirstControl.xaml, SecondControl.xaml, ThirdControl.xaml 파일을 각각 생성하여 다음과 같이 각 ..

프로그래밍/WPF 2023.04.12

[WPF] DataGrid에서 SelectedItems를 ViewModel과 바인딩하는 방법

오늘은 WPF DataGrid에서 선택된 항목들(SelectedItems)을 ViewModel과 바인딩하는 방법에 대해 알아보겠습니다. WPF의 DataGrid는 강력한 기능을 제공하지만, 선택된 항목들을 ViewModel에 직접 바인딩하는 기능은 제공하지 않습니다. 그러나 Blend SDK의 Behavior 클래스를 활용하여 이 문제를 해결할 수 있습니다. 먼저, DataGridSelectedItemsBehavior라는 이름의 새 클래스를 생성하고, 이 클래스를 Behavior로 상속합니다. public class DataGridSelectedItemsBehavior : Behavior { // ... } 다음으로, SelectedItems라는 DependencyProperty를 정의합니다. 이 프로퍼..

프로그래밍/WPF 2023.03.27

[WPF] Converter를 이용한 Binding Image Source

일반적으로 Image 컨트롤에 Image의 Path를 string 형태로 바인딩하면 화면에 이미지가 나온다. 그러나 이렇게 되면 해당 이미지를 프로그램이 계속 점유하고 있게 된다. 간단한 예를 들어보자 한쪽에는 한 화면에 좌측은 이미지가 있고, 오른쪽은 ListView에 이미지들의 나온다고 하고, ListView에서 Image의 이름을 선택하면 좌측에 해당 이미지가 보여주는 프로그램이 있다고 하자. 일반적인 바인딩의 경우 아래와 같이 할것이다. 선택한 이미지를 ImagePath라는 string에 바인딩 처리하여 Display할 것이다. 그런데 사용자는 Delete key를 통해 ListView에 있는 이미지를 삭제하고, 실제 경로에 있는 파일까지 삭제한다고 하면 아래와 같은 예외가 튀어나올 것이다. 파일..

프로그래밍/WPF 2023.03.23
반응형