[C#/WPF] Preview 이벤트와 일반 이벤트
방금 코딩을 하다가 문득 PreviewMouseDown이벤트와 MouseDown이벤트의 차이가 무엇일까 궁금해서 알아보고 글을 씁니다.
WPF의 RoutedEvent는 엘리먼트 트리의 여러 컨트롤이 이벤트에 반응할 수 있게 해주는 기능을 제공한다고 합니다. 예를 들어 아래와 같은 구조의 윈도우를 디자인했다고 생각해봅시다.
이 Preview 이벤트들은 Tunneling이라는 동작을 한다고 합니다. 그 뒤, 일반 이벤트(Preview가 붙어있지 않은 이벤트)가 역순으로 다시 발생하는 것이죠.
만약 EventArgs 매개 변수의 Handled 속성을 true로 설정하면, 터널링과 버블링이 멈춥니다. 이런 터널링과 버블링을 라우팅 전략이라고 한다고 하네요.
이러한 라우팅 전략은 다양한 상황에 대처할 수 있게 해준다고 합니다. 예를 들어 아래와 같은 상황이죠.
글을 쓰기 전까지만 해도 왜 저렇게 나눠놓았는지 잘 이해가 되지 않았는데 쓰다가 보니 확실히 알겠습니다. 위 두 예제가 개인적으로 매우 적절하다고 생각되네요. 영어를 잘 하는 분이 계시다면 StackOverflow 원문 링크로 들어가 직접 보시는 것을 추천합니다.
WPF의 RoutedEvent는 엘리먼트 트리의 여러 컨트롤이 이벤트에 반응할 수 있게 해주는 기능을 제공한다고 합니다. 예를 들어 아래와 같은 구조의 윈도우를 디자인했다고 생각해봅시다.
1. Window1-1. StackPanel1-1-1. Button그리고 버튼을 누를 경우, 아래와 같은 순서로 이벤트가 발생한다고 하네요.
- PreviewMouseDown - Window
- PreviewMouseDown - StackPanel
- PreviewMouseDown - Button
- MouseDown - Button
- MouseDown - StackPanel
- MouseDown - Window
이 Preview 이벤트들은 Tunneling이라는 동작을 한다고 합니다. 그 뒤, 일반 이벤트(Preview가 붙어있지 않은 이벤트)가 역순으로 다시 발생하는 것이죠.
만약 EventArgs 매개 변수의 Handled 속성을 true로 설정하면, 터널링과 버블링이 멈춥니다. 이런 터널링과 버블링을 라우팅 전략이라고 한다고 하네요.
이러한 라우팅 전략은 다양한 상황에 대처할 수 있게 해준다고 합니다. 예를 들어 아래와 같은 상황이죠.
모든 StackPanel의 하위 엘리먼트들이 MouseDown 이벤트를 받지 않게 한다. (StackPanel.PreviewMouseDown 이벤트 핸들러에서 EventArgs.Handled를 true로 설정하면 됩니다)
다른 어떤 컨트롤도 아닌 Window 컨트롤에서만 발생한 KeyDown 이벤트를 처리하고 싶다. (Window.KeyDown 이벤트 핸들러에서 처리하면 됩니다)
글을 쓰기 전까지만 해도 왜 저렇게 나눠놓았는지 잘 이해가 되지 않았는데 쓰다가 보니 확실히 알겠습니다. 위 두 예제가 개인적으로 매우 적절하다고 생각되네요. 영어를 잘 하는 분이 계시다면 StackOverflow 원문 링크로 들어가 직접 보시는 것을 추천합니다.
댓글
댓글 쓰기