Visual Basic 및 WPF 이벤트 처리

Visual Basic .NET에서 언어별 Handles 키워드를 사용하여 코딩 시 이벤트 처리기를 개체에 연결할 수 있습니다. 개체는 코드 숨김의 인스턴스이거나 XAML(Extensible Application Markup Language)의 요소일 수 있습니다. Handles는 CLR(공용 언어 런타임) 이벤트 또는 WPF(Windows Presentation Foundation) 라우트된 이벤트에 대한 이벤트 처리기를 할당하는 데 사용할 수 있습니다. 그러나 Handles은 라우트된 이벤트의 이벤트 처리기를 연결하는 데 사용될 때 몇 가지 제한사항이 있습니다.

필수 조건

이 문서에서는 독자들이 라우트된 이벤트에 대한 기본 지식을 갖고 있으며 라우트된 이벤트 개요를 읽었다고 가정합니다. XAML(Extensible Application Markup Language)에 익숙하고 WPF(Windows Presentation Foundation) 애플리케이션을 작성하는 방법을 알고 있으면 이 문서의 예제를 따라 하는 데 도움이 됩니다.

문법

The syntax for a Sub 선언 that uses the Handles 키워드는 다음과 같습니다: Sub <procedure name> Handles <object name>.<event name>. 이 구문은 <event name>에 의해 지정된 이벤트가 <object name>에 의해 지정된 개체에서 발생할 때 실행될 이벤트 처리기로 프로시저를 지정합니다. 이벤트는 개체 클래스 또는 기본 클래스의 멤버여야 합니다. 다음 예제에서는 Handles를 사용하여 XAML 요소에 이벤트 처리기를 연결하는 방법을 보여줍니다.

' Click event handler attached to XamlButton using Handles.
Private Sub XamlButton_Click(sender As Object, e As RoutedEventArgs) Handles XamlButton.Click

    ' Handler logic.
    Debug.WriteLine($"Click event handler attached to XamlButton using Handles.")

End Sub

코드 비하인드에 정의된 개체와 함께 Handles를 사용하려면, 일반적으로 WithEvents 키워드를 사용하여 개체를 선언합니다. WithEvents 사용법에 대한 자세한 내용은 이 예제를 참조하세요. WPF는 Friend WithEvents를 사용하여 모든 XAML 요소를 자동으로 선언합니다. 다음 예제에서는 WithEvents를 사용하여 코드 비하인드에 정의된 개체를 선언하는 방법을 보여줍니다.

' Declare a new button using WithEvents.
Dim WithEvents CodeButton As New Button With {
    .Content = "New button",
    .Background = Brushes.Yellow
}

' Click event handler attached to CodeButton using Handles.
Private Sub CodeButton_Click(sender As Object, e As RoutedEventArgs) Handles CodeButton.Click

    ' Handler logic.
    Debug.WriteLine($"Click event handler attached to CodeButton using Handles.")

End Sub

여러 이벤트에 동일한 처리기를 사용하려면 <object name>.<event name> 이벤트를 쉼표로 구분합니다. 예: Sub Button_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click, Button2.Click. 쉼표로 구분된 이벤트의 순서는 중요하지 않습니다.

여러 Handles 문을 사용하여 동일한 이벤트에 대해 다른 처리기를 할당할 수 있습니다. 문의 순서는 이벤트가 발생할 때 처리기가 호출되는 순서를 결정하지 않습니다.

팁 (조언)

Handles로 추가된 핸들러를 제거하려면 RemoveHandler를 호출합니다. 예: RemoveHandler Button1.Click, AddressOf Button1_Click.

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

XAML에 정의된 개체의 경우 Handles 이벤트 구문 <object name>.<event name>에는 개체를 나타내는 XAML 요소에 Name 또는 x:Name 속성이 있어야 합니다. 그러나 XAML 페이지의 루트 요소에는 name 속성이 필수는 아니며, Me라는 이름을 사용할 수 있습니다. 다음 예에서는 Handles을 사용하여 XAML 페이지 루트에 이벤트 처리기를 연결하는 방법을 설명합니다.

' Loaded event handler attached to the XAML page root using Handles.
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

    ' Handler logic.
    Debug.WriteLine($"Loaded event handler attached to Window using Handles.")

End Sub

XAML 페이지가 컴파일될 때, Name 또는 x:Name 매개 변수가 포함된 모든 XAML 요소가 Friend WithEvents로 선언됩니다. 따라서 모든 XAML 요소를 Handles와 함께 사용할 수 있습니다.

팁 (조언)

Visual Studio IntelliSense에서 Handles과 함께 사용할 수 있는 개체를 보여줍니다.

Handles, XAML 특성 구문, AddHandler 문, AddHandler 메서드 중 무엇을 사용하여 이벤트 처리기를 연결하는지에 관계없이 이벤트 시스템 동작은 동일합니다.

비고

XAML 특성과 Handles를 사용하여 동일한 이벤트 처리기를 동일한 이벤트에 연결하지 마세요. 그렇지 않으면 이벤트 처리기가 각 이벤트에 대해 두 번 호출됩니다.

제한점

Handles 키워드에는 다음과 같은 사용 제한이 있습니다.

  • 이벤트가 개체의 클래스 또는 기본 클래스의 멤버인 경우에만 Handles를 사용하여 이벤트 처리기를 개체에 연결할 수 있습니다. 예를 들어, Handles를 사용하여 기본 클래스 ButtonBaseClick 라우트 이벤트를 발생시키는 단추에 Click 이벤트 처리기를 연결할 수 있습니다. 그러나 라우트된 이벤트의 기능 중 하나는 요소 트리를 따라 이동하며 이벤트를 발생시킨 요소보다 더 높은 수준에서 이벤트를 수신하고 처리할 수 있다는 점입니다. 부모 요소가 수신 대기하고 처리하는 라우트된 이벤트를 연결된 이벤트라고 합니다. Handles는 연결된 이벤트에 사용할 수 없습니다. 해당 구문은 이벤트를 발생시킨 요소와 다른 수신기를 XAML 요소 트리에 지정하는 것을 지원하지 않기 때문입니다. 연결된 이벤트에 대한 이벤트 처리기를 할당하려면 XAML 특성 구문 또는 AddHandler 메서드를 사용해야 합니다. 연결된 이벤트에 대한 자세한 내용은 연결된 이벤트 개요WPF의 연결된 이벤트를 참조하세요.

  • Handles 구문은 Handled 이벤트에 대한 이벤트 처리기 호출을 지원하지 않습니다. AddHandler(RoutedEvent, Delegate, Boolean) 메서드를 사용하여 이벤트 처리기를 Handled 이벤트에 연결하고, 해당 handledEventsToo 매개 변수를 true로 설정하여 이벤트 처리기가 호출되도록 합니다.

참고하십시오