Visual Basic 및 WPF 이벤트 처리

특히 Microsoft Visual Basic .NET 언어의 경우 언어별 Handles 키워드를 사용하면 특성을 사용하여 이벤트 처리기를 연결하거나 AddHandler 메서드를 사용하는 대신 이벤트 처리기를 인스턴스와 연결할 수 있습니다. 그러나 처리기를 인스턴스에 연결하는 Handles 기술에는 몇 가지 제한 사항이 있습니다. 이는 Handles 구문이 WPF 이벤트 시스템의 특정 라우트된 이벤트 기능 중 일부를 지원할 수 없기 때문입니다.

WPF 애플리케이션에서 "Handles" 사용

Handles를 사용하여 인스턴스 및 이벤트에 연결되는 이벤트 처리기는 모두 인스턴스의 partial 클래스 선언 내에 정의되어야 하며, 이는 요소에서 특성 값을 통해 할당되는 이벤트 처리기에 대한 요구 사항이기도 합니다. Name 속성 값이 있는(또는 x:Name 지시문이 선언된) 페이지의 요소에 대해서만 Handles를 지정할 수 있습니다. 그 이유는 XAML의 NameHandles 구문에 필요한 Instance.Event 참조 형식을 지원하는 데 필요한 인스턴스 참조를 만들기 때문입니다. Name 참조 없이 Handles에 사용할 수 있는 유일한 요소는 partial 클래스를 정의하는 루트 요소 인스턴스입니다.

Handles 다음에 오는 Instance.Event 참조를 쉼표로 구분하여 동일한 처리기를 여러 요소에 할당할 수 있습니다.

Handles를 사용하여 둘 이상의 처리기를 동일한 Instance.Event 참조에 할당할 수 있습니다. Handles 참조에서 처리기가 지정되는 순서에 중요성을 부여하지 마세요. 동일한 이벤트를 처리하는 처리기는 순서에 관계없이 호출될 수 있다고 가정해야 합니다.

선언에서 Handles를 사용하여 추가된 처리기를 제거하려면 RemoveHandler를 호출할 수 있습니다.

해당 멤버 테이블에서 처리되고 있는 이벤트를 정의하는 인스턴스에 처리기를 연결하는 한 Handles를 사용하여 라우트된 이벤트에 대한 처리기를 연결할 수 있습니다. 라우트된 이벤트의 경우 Handles를 사용하여 연결된 처리기는 XAML 특성으로 연결되거나 AddHandler의 공용 시그니처를 사용하여 연결된 처리기와 동일한 회람 규칙을 따릅니다. 즉, 이벤트가 처리된 것으로 이미 표시된 경우(이벤트 데이터의 Handled 속성이 True임) Handles로 연결된 처리기가 해당 이벤트 인스턴스에 대한 응답으로 호출되지 않습니다. 이벤트는 경로에 있는 다른 요소의 인스턴스 처리기에서 처리되거나 경로를 따르는 현재 요소 또는 이전 요소의 클래스 처리에 의해 처리된 것으로 표시할 수 있습니다. 쌍을 이루는 터널/버블 이벤트를 지원하는 입력 이벤트의 경우 터널링 경로에서 이벤트 쌍을 처리된 것으로 표시했을 수 있습니다. 라우트된 이벤트에 대한 자세한 내용은 라우트된 이벤트 개요를 참조하세요.

처리기를 추가하는 "Handles"의 제한 사항

Handles는 연결된 이벤트에 대해 처리기를 참조할 수 없습니다. 해당 연결된 이벤트에 add 접근자 메서드를 사용하거나 XAML의 typename.eventname 이벤트 특성을 사용해야 합니다. 자세한 내용은 라우트된 이벤트 개요를 참조하세요.

라우트된 이벤트의 경우 Handles를 사용하면 해당 이벤트가 인스턴스 멤버 테이블에 있는 인스턴스에 대해서만 처리기를 할당할 수 있습니다. 그러나 일반적으로 라우트된 이벤트를 사용하면 부모 요소는 부모 요소의 해당 멤버 테이블에 해당 이벤트가 없는 경우에도 자식 요소의 이벤트에 대한 수신기가 될 수 있습니다. 특성 구문에서는 처리하려는 이벤트를 실제로 정의하는 형식을 한정하는 typename.membername 특성 형태를 통해 이를 지정할 수 있습니다. 예를 들어 부모 Page(Click 이벤트가 정의되지 않음)는 Button.Click 양식으로 특성 처리기를 할당하여 단추 클릭 이벤트를 수신 대기할 수 있습니다. 그러나 Handlestypename.membername 형태를 지원하지 않습니다. 이는 충돌하는 Instance.Event 형태를 지원해야 하기 때문입니다. 자세한 내용은 라우트된 이벤트 개요를 참조하세요.

Handles는 처리된 것으로 이미 표시된 이벤트에 대해 호출되는 처리기를 연결할 수 없습니다. 대신 코드를 사용하여 AddHandler(RoutedEvent, Delegate, Boolean)handledEventsToo 오버로드를 호출해야 합니다.

참고

XAML에서 동일한 이벤트에 대한 이벤트 처리기를 지정할 때 Visual Basic 코드에서 Handles 구문을 사용하지 마세요. 이 경우 이벤트 처리기가 두 번 호출됩니다.

WPF에서 "Handles" 기능을 구현하는 방법

XAML(Extensible Application Markup Language) 페이지가 컴파일되면 중간 파일은 Name 속성이 설정된(또는 x:Name 지시문이 선언된) 페이지의 모든 요소에 대한 FriendWithEvents 참조를 선언합니다. 각 명명된 인스턴스는 Handles를 통해 처리기에 할당할 수 있는 요소일 수 있습니다.

참고

Visual Studio 내에서 IntelliSense는 페이지의 Handles 참조에 사용할 수 있는 요소의 완성을 보여 줄 수 있습니다. 그러나 이렇게 하려면 중간 파일에서 모든 Friends 참조를 채울 수 있도록 하나의 컴파일 패스가 필요할 수 있습니다.

참고 항목