프로그래밍/WPF

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

흔한티벳여우 2024. 11. 18. 10:33
반응형

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에서 마우스 이벤트를 처리하는 데 중요한 역할을 합니다. 이 두 이벤트의 차이를 이해하고 적절히 활용하면 더 나은 사용자 경험을 제공할 수 있습니다.

반응형