Visual Basic 및 WPF 이벤트 처리
특히 Microsoft Visual Basic .NET 언어의 경우 언어별 Handles
키워드를 사용하면 특성을 사용하여 이벤트 처리기를 연결하거나 AddHandler 메서드를 사용하는 대신 이벤트 처리기를 인스턴스와 연결할 수 있습니다. 그러나 처리기를 인스턴스에 연결하는 Handles
기술에는 몇 가지 제한 사항이 있습니다. 이는 Handles
구문이 WPF 이벤트 시스템의 특정 라우트된 이벤트 기능 중 일부를 지원할 수 없기 때문입니다.
WPF 애플리케이션에서 "Handles" 사용
Handles
를 사용하여 인스턴스 및 이벤트에 연결되는 이벤트 처리기는 모두 인스턴스의 partial 클래스 선언 내에 정의되어야 하며, 이는 요소에서 특성 값을 통해 할당되는 이벤트 처리기에 대한 요구 사항이기도 합니다. Name 속성 값이 있는(또는 x:Name 지시문이 선언된) 페이지의 요소에 대해서만 Handles
를 지정할 수 있습니다. 그 이유는 XAML의 Name은 Handles
구문에 필요한 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
양식으로 특성 처리기를 할당하여 단추 클릭 이벤트를 수신 대기할 수 있습니다. 그러나 Handles
는 typename.membername 형태를 지원하지 않습니다. 이는 충돌하는 Instance.Event 형태를 지원해야 하기 때문입니다. 자세한 내용은 라우트된 이벤트 개요를 참조하세요.
Handles
는 처리된 것으로 이미 표시된 이벤트에 대해 호출되는 처리기를 연결할 수 없습니다. 대신 코드를 사용하여 AddHandler(RoutedEvent, Delegate, Boolean)의 handledEventsToo
오버로드를 호출해야 합니다.
참고
XAML에서 동일한 이벤트에 대한 이벤트 처리기를 지정할 때 Visual Basic 코드에서 Handles
구문을 사용하지 마세요. 이 경우 이벤트 처리기가 두 번 호출됩니다.
WPF에서 "Handles" 기능을 구현하는 방법
XAML(Extensible Application Markup Language) 페이지가 컴파일되면 중간 파일은 Name 속성이 설정된(또는 x:Name 지시문이 선언된) 페이지의 모든 요소에 대한 Friend
WithEvents
참조를 선언합니다. 각 명명된 인스턴스는 Handles
를 통해 처리기에 할당할 수 있는 요소일 수 있습니다.
참고
Visual Studio 내에서 IntelliSense는 페이지의 Handles
참조에 사용할 수 있는 요소의 완성을 보여 줄 수 있습니다. 그러나 이렇게 하려면 중간 파일에서 모든 Friends
참조를 채울 수 있도록 하나의 컴파일 패스가 필요할 수 있습니다.
참고 항목
.NET Desktop feedback