[C#/WPF] Preview 이벤트와 일반 이벤트

  방금 코딩을 하다가 문득 PreviewMouseDown이벤트와 MouseDown이벤트의 차이가 무엇일까 궁금해서 알아보고 글을 씁니다.

  WPFRoutedEvent는 엘리먼트 트리의 여러 컨트롤이 이벤트에 반응할 수 있게 해주는 기능을 제공한다고 합니다. 예를 들어 아래와 같은 구조의 윈도우를 디자인했다고 생각해봅시다.
1. Window1-1. StackPanel1-1-1. Button
  그리고 버튼을 누를 경우, 아래와 같은 순서로 이벤트가 발생한다고 하네요.


  1. PreviewMouseDown - Window 
  2. PreviewMouseDown - StackPanel
  3. PreviewMouseDown - Button
  4. MouseDown - Button
  5. MouseDown - StackPanel
  6. MouseDown - Window


  이 Preview 이벤트들은 Tunneling이라는 동작을 한다고 합니다. 그 뒤, 일반 이벤트(Preview가 붙어있지 않은 이벤트)가 역순으로 다시 발생하는 것이죠.

  만약 EventArgs 매개 변수의 Handled 속성을 true로 설정하면, 터널링과 버블링이 멈춥니다. 이런 터널링과 버블링을 라우팅 전략이라고 한다고 하네요.

  이러한 라우팅 전략은 다양한 상황에 대처할 수 있게 해준다고 합니다. 예를 들어 아래와 같은 상황이죠.

모든 StackPanel의 하위 엘리먼트들이 MouseDown 이벤트를 받지 않게 한다. (StackPanel.PreviewMouseDown 이벤트 핸들러에서 EventArgs.Handledtrue로 설정하면 됩니다)
다른 어떤 컨트롤도 아닌 Window 컨트롤에서만 발생한 KeyDown 이벤트를 처리하고 싶다. (Window.KeyDown 이벤트 핸들러에서 처리하면 됩니다) 

  글을 쓰기 전까지만 해도 왜 저렇게 나눠놓았는지 잘 이해가 되지 않았는데 쓰다가 보니 확실히 알겠습니다. 위 두 예제가 개인적으로 매우 적절하다고 생각되네요. 영어를 잘 하는 분이 계시다면 StackOverflow 원문 링크로 들어가 직접 보시는 것을 추천합니다.

댓글

이 블로그의 인기 게시물

C# 남아도는 메모리에도 불구하고 OutOfMemoryException이 발생한다면?

USB를 뒤는 괜찮은데 앞에 꽂으면 인식이 힘들다?

MySQL 데이터 타입과 Java 데이터 타입 비교/매칭