반응형
WPF에서 마우스 이벤트는 두 가지 주요 유형으로 나뉩니다: PreviewMouseDown과 MouseDown. 이 두 이벤트는 이벤트 라우팅 방식에서 중요한 차이를 가지고 있습니다. 이번 포스트에서는 이 두 이벤트의 차이점과 실행 순서를 살펴보겠습니다.
이벤트 라우팅 방식
1. PreviewMouseDown:
터널링 단계에서 발생합니다. 즉, 이벤트가 부모 요소에서 자식 요소로 전파됩니다.
2. MouseDown:
버블링 단계에서 발생합니다. 즉, 이벤트가 자식 요소에서 부모 요소로 전파됩니다.
실행 순서
이벤트가 발생할 때의 실행 순서는 다음과 같습니다:
부모 PreviewMouseDown
↓
자식 PreviewMouseDown
↓
자식 MouseDown
↓
부모 MouseDown
예제 코드
아래는 PreviewMouseDown과 MouseDown 이벤트를 사용하는 간단한 예제입니다.
XAML 코드
<Grid PreviewMouseDown="Grid_PreviewMouseDown"
MouseDown="Grid_MouseDown">
<Button MouseDown="Button_MouseDown"
PreviewMouseDown="Button_PreviewMouseDown"
Content="테스트 버튼"/>
</Grid>
C# 코드
private void Grid_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
Console.WriteLine("1. Grid PreviewMouseDown (부모 터널링)");
}
private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
Console.WriteLine("2. Button PreviewMouseDown (자식 터널링)");
}
private void Button_MouseDown(object sender, MouseButtonEventArgs e)
{
Console.WriteLine("3. Button MouseDown (자식 버블링)");
}
private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
{
Console.WriteLine("4. Grid MouseDown (부모 버블링)");
}
출력 결과
버튼을 클릭했을 때의 출력 결과는 다음과 같습니다:
1. Grid PreviewMouseDown (부모 터널링)
2. Button PreviewMouseDown (자식 터널링)
3. Button MouseDown (자식 버블링)
4. Grid MouseDown (부모 버블링)
이벤트 취소
이벤트 흐름에서 e.Handled = true를 설정하면 이후의 이벤트가 취소됩니다. 예를 들어, Button_PreviewMouseDown에서 e.Handled = true를 설정하면, 그 이후의 Button MouseDown과 Grid MouseDown 이벤트는 실행되지 않습니다.
private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
Console.WriteLine("2. Button PreviewMouseDown (자식 터널링)");
e.Handled = true; // 이 이후의 이벤트는 실행되지 않음
}
이렇게 하면 출력은 다음과 같이 됩니다:
1. Grid PreviewMouseDown (부모 터널링)
2. Button PreviewMouseDown (자식 터널링)
// 3번과 4번은 실행되지 않음
결론
PreviewMouseDown과 MouseDown 이벤트는 WPF에서 마우스 이벤트를 처리하는 데 중요한 역할을 합니다. 이 두 이벤트의 차이를 이해하고 적절히 활용하면 더 나은 사용자 경험을 제공할 수 있습니다.
반응형
'프로그래밍 > WPF' 카테고리의 다른 글
[WPF] DataGrid 가상화와 ComboBox SelectedItem 불일치 문제 해결: MVVM 패턴에서의 효율적인 접근 방법 (0) | 2024.10.15 |
---|---|
[WPF] DataGrid 행 더블 클릭 시 Command 실행하기 (0) | 2023.11.03 |
[WPF] HelixToolkit.Wpf.SharpDX 사용하여 3D 공간에서 마우스 드래그로 선택 영역 그리기 (0) | 2023.10.30 |
[WPF] Slider 드래그 완료 시점에 값 업데이트하기 (0) | 2023.07.26 |
[WPF] Data Binding에서 StringFormat 사용하기 (0) | 2023.07.25 |