미리 보기 이벤트

터널링 이벤트라고도 하는 미리 보기 이벤트는 경로의 방향이 애플리케이션 루트에서 이벤트를 발생시키고 이벤트 데이터의 원본으로 보고되는 요소 쪽으로 이동하는 라우트된 이벤트입니다. 모든 이벤트 시나리오가 미리 보기 이벤트를 지원하거나 요구하지는 않습니다. 이 항목에서는 미리 보기 이벤트가 존재하는 상황, 애플리케이션 또는 구성 요소가 해당 이벤트를 처리하는 방법 및 사용자 지정 구성 요소 또는 클래스에서 미리 보기 이벤트를 만드는 것이 적절한 경우에 대해 설명합니다.

미리 보기 이벤트 및 입력

일반적으로 미리 보기 이벤트를 처리하는 경우 이벤트 데이터에서 처리되는 이벤트를 표시하는 데 주의해야 합니다. 발생시킨 요소(이벤트 데이터의 원본으로 보고되는 요소)가 아닌 다른 요소에서 미리 보기 이벤트를 처리하면 요소에서 발생한 이벤트를 처리할 기회가 제공되지 않는 효과가 있습니다. 특히 해당 요소가 컨트롤의 구성 내 관계에 있는 경우 이 결과가 원하는 결과일 수 있습니다.

구체적으로 입력 이벤트의 경우 미리 보기 이벤트는 동일한 버블링 이벤트와 이벤트 데이터 인스턴스를 공유합니다. 미리 보기 이벤트 클래스 처리기를 사용하여 처리된 입력 이벤트를 표시하는 경우 버블링 입력 이벤트 클래스 처리기가 호출되지 않습니다. 또는 미리 보기 이벤트 인스턴스 처리기를 사용하여 처리된 이벤트를 표시하면 버블링 이벤트에 대한 처리기는 일반적으로 호출되지 않습니다. 클래스 처리기 또는 인스턴스 처리기는 이벤트가 처리된 것으로 표시된 경우에도 호출할 수 있는 옵션으로 등록하거나 연결할 수 있지만 이 기술은 일반적으로 사용되지 않습니다.

클래스 처리에 대한 자세한 내용과 미리 보기 이벤트와의 관계는 라우트된 이벤트를 처리된 것으로 표시 및 클래스 처리를 참조하세요.

컨트롤에서 억제하는 이벤트 문제 해결

미리 보기 이벤트가 일반적으로 사용되는 한 가지 시나리오는 입력 이벤트의 복합 제어 처리에 사용됩니다. 경우에 따라 컨트롤 작성자가 특정 이벤트가 해당 컨트롤에서 시작되는 것을 방지하여 더 많은 정보를 전달하거나 보다 구체적인 동작을 의미하는 구성 요소 정의 이벤트를 대체합니다. 예를 들어 Windows Presentation Foundation(WPF) Button은 마우스 캡처와 항상 Button 자체에 의해 발생하는 Click 이벤트 발생을 대신해 Button 또는 복합 요소에 의해 발생하는 MouseLeftButtonDownMouseRightButtonDown 버블링 이벤트를 억제합니다. 이벤트와 그 데이터는 경로를 따라 계속 진행되지만 Button이 이벤트 데이터를 Handled로 표시하기 때문에 handledEventsToo 케이스에서 동작해야 한다고 구체적으로 표시된 이벤트의 처리기만 호출됩니다. 애플리케이션의 루트에 대한 다른 요소에 여전히 제어 억제 이벤트를 처리할 기회가 필요하다면, 한 가지 대안은 true로 지정된 handledEventsToo에 처리기를 연결하는 것입니다. 그러나 처리한 라우팅 방향을 입력 이벤트와 동일한 미리 보기로 변경하는 것이 더 간단한 방법인 경우가 많습니다. 예를 들어 컨트롤이 MouseLeftButtonDown을 억제할 경우 대신 PreviewMouseLeftButtonDown에 대한 처리기를 연결해 보세요. 이 기술은 MouseLeftButtonDown 같은 기본 요소 입력 이벤트에만 작동합니다. 이러한 입력 이벤트는 터널/버블 쌍을 사용하고, 두 이벤트를 모두 발생시키며, 이벤트 데이터를 공유합니다.

이러한 각 기술에는 부작용 또는 제한 사항이 있습니다. 미리 보기 이벤트 처리의 부작용은 해당 시점에서 이벤트를 처리하면 버블링 이벤트를 처리할 것으로 예상되는 처리기가 비활성화될 수 있으므로 일반적으로 경로의 미리 보기 부분에 있는 동안 처리된 이벤트를 표시하는 것이 좋지 않다는 제한이 있습니다. handledEventsToo 기술의 제한 사항은 XAML에서 특성으로 handledEventsToo 처리기를 지정할 수 없다는 점이며, 따라서 처리기가 연결될 요소에 개체 참조를 얻은 후 코드에서 이벤트 처리기를 등록해야 합니다.

참고 항목