WPF 미리보기 이벤트 란 무엇입니까?


79

모든 요소에 KeyDown 및 PreviewKeyDown 이벤트가있는 것처럼 "Preview ******"이벤트에 대한 설명을 찾고 있습니다. 차이점은 무엇입니까?

Control에서 파생 된 모든 클래스에서 두 메서드를 모두 재정의 할 수 있습니다. OnKeyDown 및 OnPreviewKeyDown, 이제 사용자 지정 컨트롤을 작성하고 있습니다. 어떤 메서드를 사용해야합니까? 그리고 둘 다의 차이점은 무엇입니까?

답변:


126

프로그래밍 WPF-Chris Sells 및 Ian Griffith

직접 이벤트를 제외하고 WPF는 대부분의 라우트 된 이벤트를 쌍으로 정의합니다. 하나는 터널링이고 다른 하나는 버블 링입니다. 터널링 이벤트 이름은 항상 '미리보기'로 시작하고 먼저 발생합니다. 이를 통해 부모는 이벤트가 어린이에게 도달하기 전에 이벤트를 볼 수 있습니다. 이것은 버블 링 대응 물이 뒤 따릅니다. 대부분의 경우 버블 링 만 처리합니다. 미리보기는 일반적으로

  • 이벤트 차단 ( e.Handled = true)
  • 부모가 정상적인 이벤트 처리에 앞서 무언가를하도록합니다.

예를 들어 UI Tree = Button에 Grid에 Ellipse가 포함되어있는 경우 Ellipse를
클릭하면 (MouseDownButton이 Button에 의해 먹히고 대신 Click이 발생합니다.)

PreviewMouseDownButton
PreviewMouseDownGrid
PreviewMouseDownCanvas
PreviewMouseDownEllipse
MouseDownEllipse
MouseDownCanvas
MouseDownGrid

고마워, 나는 MSDN에서 모든 것을 찾아 보았지만 찾지 못했습니다. 버블 링과 터널링에 대해 이야기하는 모든 사람들을 읽었지만이 텍스트 조각은 모든 곳에서 누락되었습니다.
Akash Kava

9

이 블로그 항목이 차이점을 설명하는 데 정말 유용하다는 것을 알았습니다.

http://joshsmithonwpf.wordpress.com/2007/06/22/overview-of-routed-events-in-wpf/

시각적 트리가 있습니다. 이벤트가 트리의 요소에서 발생하면 먼저 미리보기 이벤트가 루트에서 요소로 이동합니다 (터널링). PreviewKeyDown 이벤트가 이러한 모든 요소에서 발생한 다음 "일반"이벤트가 발생합니다. 이벤트는 요소에서 루트로 이동합니다 (버블 링).


3

기본적으로 동일한 이벤트이지만 메인 이벤트 직전에 발생합니다. 이러한 이벤트가 발생할 때 컨트롤의 정상적인 동작을 방해하지 않고 이러한 유형의 이벤트를 수신 할 수 있도록 존재합니다.

예를 들어 버튼은 Click 또는 MouseEnter 등을 할 때 작업을 수행합니다. 이러한 이벤트를 직접 처리하는 경우 동일한 작업을 수행해야합니다. 그렇지 않으면 버튼이 동일하게 작동하지 않습니다. 미리보기 이벤트는 기존 기능을 망칠 염려없이 동일한 타임 라인의 이벤트를 제공합니다.

이것은 사용자 정의 스타일 / 트리거 / 컨트롤 템플릿을 다룰 때 특히 유용합니다. 컨트롤 모양 / 동작 재정의를 시작할 때.

따라서 컨트롤에서 OnKeyDown 이벤트에서 원하는 주요 작업을 수행하고 다른 사람이 사용할 수 있도록 미리보기 이벤트를 남겨 두는 것이 내가 작업하는 방식입니다.


3

이 차이는 WPF가 이벤트 처리 전략을 구현하는 방식 인 라우트 된 이벤트와 관련이 있습니다. 표준 이벤트 이름 (예 : KeyDown 등)은 버블 링 라우팅 전략을 의미합니다. "Preview"(예 : PreviewKeyDown 등)가 앞에 붙는 것은 터널링 라우팅 전략을 의미합니다. 여기 에서 이러한 전략에 대해 자세히 읽을 수 있습니다 . 기본적으로 WPF의 이벤트가 호출되면 먼저 시각적 트리의 맨 위 요소에서 이벤트를 호출 한 요소로 이동하고 마지막으로 위쪽으로 반환됩니다. 트리를 내려가는 도중에 PreviewKeyDown 이벤트가 발생하고 돌아 오는 길에 순서대로 KeyDown 이벤트가 발생합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.