Visual Basic 및 WPF 이벤트 처리(WPF .NET)

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

중요

.NET 6 및 .NET 5(.NET Core 3.1 포함)에 관한 데스크톱 가이드 설명서는 제작 중입니다.

필수 구성 요소

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

구문

Handles 키워드를 사용하는 Sub 선언의 구문은 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 문의 순서는 이벤트가 발생할 때 처리기가 호출되는 순서를 결정하지 않습니다.

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

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

XAML에 정의된 개체의 경우 Handles 이벤트 구문 <object name>.<event name>에는 개체를 나타내는 XAML 요소에 Name 또는 x:Name 속성이 있어야 합니다. 그러나 Me라는 이름을 사용할 수 있는 XAML 페이지 루트 요소에는 name 속성이 필요하지 않습니다. 다음 예제에서는 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를 사용하여 이벤트 처리기를 개체에 연결할 수 있습니다. 예를 들어, 기본 클래스 ButtonBaseClick 라우트된 이벤트를 발생시키는 단추에 Click 이벤트 처리기를 연결하는 데 Handles를 사용할 수 있습니다. 그러나 라우트된 이벤트의 기능 중 하나는 요소 트리를 트래버스하여 이벤트를 발생시킨 요소보다 높은 수준에서 Click 이벤트를 수신 대기하고 처리할 수 있다는 것입니다. 부모 요소가 수신 대기하고 처리하는 라우트된 이벤트를 연결된 이벤트라고 합니다. Handles는 연결된 이벤트에 사용할 수 없습니다. 해당 구문은 이벤트를 발생시킨 요소와 다른 수신기를 XAML 요소 트리에 지정하는 것을 지원하지 않기 때문입니다. 연결된 이벤트에 대한 이벤트 처리기를 할당하려면 XAML 특성 구문 또는 AddHandler 메서드를 사용해야 합니다. 연결된 이벤트에 대한 자세한 내용은 연결된 이벤트 개요WPF의 연결된 이벤트를 참조하세요.

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

참고 항목