다음을 통해 공유


UIElement.AddHandler(RoutedEvent, Object, Boolean) 메서드

정의

지정된 라우트된 이벤트에 대해 라우트된 이벤트 처리기를 추가하여 해당 처리기를 현재 요소의 처리기 컬렉션에 추가합니다. event가 다른 곳에서 처리되더라도 제공된 처리기를 호출하도록 handledEventsTootrue 로 지정합니다.

public:
 virtual void AddHandler(RoutedEvent ^ routedEvent, Platform::Object ^ handler, bool handledEventsToo) = AddHandler;
void AddHandler(RoutedEvent const& routedEvent, IInspectable const& handler, bool const& handledEventsToo);
public void AddHandler(RoutedEvent routedEvent, object handler, bool handledEventsToo);
function addHandler(routedEvent, handler, handledEventsToo)
Public Sub AddHandler (routedEvent As RoutedEvent, handler As Object, handledEventsToo As Boolean)

매개 변수

routedEvent
RoutedEvent

처리할 라우트된 이벤트의 식별자입니다.

handler
Object

Platform::Object

IInspectable

처리기 구현에 대한 참조입니다.

handledEventsToo
Boolean

bool

true 이면 라우트된 이벤트가 해당 이벤트 데이터에서 처리된 것으로 표시된 경우에도 호출되도록 처리기를 등록합니다.

false 이면 라우트된 이벤트가 이미 처리된 것으로 표시된 경우 호출되지 않을 기본 조건으로 처리기를 등록합니다. 기본값은 false입니다.

제어 구성을 위해 Windows 런타임 이벤트 시스템의 의도된 디자인을 방해하므로 라우트된 이벤트를 정기적으로 다시 처리하도록 요청하지 마세요.

예제

이 예제에서는 AddHandler 및 handledEventsTootrue로 사용하여 이벤트 처리기를 연결하기 위한 기본 구문을 보여 줍니다. 이 경우 유선 중인 이벤트는 Tapped입니다. 일반적인 와이어 처리기 위치는 페이지에 대해 로드되거나 템플릿 컨트롤 의 경우 OnApplyTemplate 입니다.

void MyControl::MyPointerPressedHandler(
    winrt::Windows::Foundation::IInspectable const &sender,
    winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e) {
  // implementation..
}

this->AddHandler(
    winrt::Windows::UI::Xaml::UIElement::PointerPressedEvent(),
    winrt::box_value(winrt::Windows::UI::Xaml::Input::PointerEventHandler(this, &MyControl::MyPointerPressedHandler)),
    true);

// Or passing the handler as a lambda, instead of a member function:
this->AddHandler(
    winrt::Windows::UI::Xaml::UIElement::PointerPressedEvent(),
    winrt::box_value(winrt::Windows::UI::Xaml::Input::PointerEventHandler(
      [=](auto &&, winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs const &args) {
      // ...
    })),
    true);    
void MainPage::pageRoot_Tapped(Platform::Object^ sender, Windows::UI::Xaml::Input::TappedRoutedEventArgs^ e)
{
     //implementation
}
void MainPage::pageRoot_Loaded(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
     this->AddHandler(UIElement::TappedEvent, ref new TappedEventHandler(this, &MainPage::pageRoot_Tapped), true);
}
private void pageRoot_Tapped(object sender, TappedRoutedEventArgs e)
{
    //implementation
}
private void pageRoot_Loaded_1(object sender, RoutedEventArgs e)
{
    this.AddHandler(UIElement.TappedEvent, new TappedEventHandler(pageRoot_Tapped), true);
}
Private Sub Page_Tapped(sender As Object, e As TappedRoutedEventArgs)
    ' implementation
End Sub
Private Sub Page_Loaded_1(sender As Object, e As RoutedEventArgs)
    Me.AddHandler(UIElement.TappedEvent, New TappedEventHandler(AddressOf Page_Tapped), True)
End Sub

설명

일반적으로 배선 이벤트 처리기에 사용하는 언어별 구문의 일반적인 대체 용도로 AddHandler를 사용하지 마세요. 모든 이벤트에 routedEvent로 전달할 수 있는 식별자가 있는 것은 아니므로 작동하지 않습니다. AddHandler는 특히 라우트된 이벤트를 위한 것이며 주로 handledEventsTootrue로 전달하여 사용하도록 설정된 특정 시나리오를 위한 것입니다. 자세한 내용은 이벤트 및 라우트된 이벤트 개요를 참조하세요.

라우트된 이벤트 식별자

라우트된 이벤트 식별자는 일반적으로 UIElement의 정적 속성 멤버입니다. 예를 들어 KeyUp 이벤트에 대한 처리기를 추가하려면 이 매개 변수에 대해 KeyUpEvent 를 전달합니다. 소수의 Windows 런타임 이벤트에만 이 식별자가 있습니다. UIElement의 라우트된 이벤트만 이 사용에 사용할 수 있는 식별자 API가 있습니다. 일반적으로 포인터 수준, 제스처 수준, 조작 수준 등 다양한 수준의 입력 작업과 관련된 이벤트입니다. 또한 키 입력 이벤트를 이러한 방식으로 처리할 수 있습니다.

다음은 라우트된 이벤트 식별자를 노출하므로 AddHandler 호출에 의해 등록된 처리기에서 처리할 수 있는 라우트된 이벤트 목록입니다.

처리기 매개 변수

처리기 매개 변수는 형식화되지 않은 매개 변수이지만 원하는 이벤트와 관련된 처리기 메서드를 참조하는 새 대리자를 제공해야 합니다. 예를 들어 KeyUp 이벤트를 처리하는 경우 해당 KeyEventHandler 대리자 서명을 기반으로 하는 메서드를 참조하는 새 KeyEventHandler instance 전달합니다. 이를 위해서는 역참조가 필요하며 역참조 구문은 사용 중인 언어에 따라 달라집니다. 이 항목의 예제를 참조하세요.

handledEventsToo를 사용하는 경우

실용적인 방식으로 하위 수준 입력 이벤트를 처리하는 것은 복잡한 작업입니다. 많은 컨트롤은 특정 이벤트가 처리된 것으로 표시되고 다른 보다 직관적인 이벤트로 대체되는 동작을 구현합니다. 일반적으로 컨트롤은 일부 디자인 의도가 있는 경우에만 라우트된 이벤트를 처리됨으로 표시합니다. 그러나 특정 시나리오에서 이러한 디자인 의도는 입력 이벤트의 특정 처리에 필요한 것이 아닐 수 있습니다. handledEventsTootrue로 사용하여 처리기를 등록하는 것이 적절한 시나리오에 적합합니다. 그러나 당신은 일상적으로이 작업을 수행해서는 안됩니다. 처리된 경우에도 모든 이벤트에 대한 응답으로 처리기를 호출하면 자체 앱 이벤트 처리 논리가 복잡해집니다. 처리기 논리가 상당한 경우 성능이 저하될 수 있습니다. 특정 컨트롤이 앱 논리로 처리하려는 이벤트를 처리하고 있음을 발견한 경우에만 처리기를 이미 처리된 이벤트에 연결해야 합니다.

컨트롤의 클래스 처리 동작을 방지하는 또 다른 방법은 컨트롤이 이벤트를 처리된 것으로 표시하는 미리 구성된 재정의인 OnEvent 메서드를 제어하고 재정의하는 서브클래스입니다. 그러나 이 것 역시 복잡할 수 있습니다. 기본 구현은 이벤트를 처리된 것으로 표시하므로 기본 구현을 호출하지 않고 컨트롤의 처리 구현을 재현해야 할 수 있습니다. 자세한 내용은 이벤트 및 라우트된 이벤트 개요를 참조하세요.

적용 대상

추가 정보