Obsługa zdarzeń w Visual Basic i WPF (WPF .NET)
Jeśli kodujesz w Visual Basic .NET, możesz użyć specyficznego dla języka słowa kluczowego Handles, aby dołączyć program obsługi zdarzeń do obiektu. Obiekt może być wystąpieniem w logice kodu programu lub elementem w języku Extensible Application Markup Language (XAML).
Handles
można użyć do przypisywania obsługiwaczy zdarzeń dla zdarzeń środowiska uruchomieniowego języka wspólnego (CLR) lub zdarzeń kierowanych w Windows Presentation Foundation (WPF) . Jednak Handles
ma pewne ograniczenia użycia , gdy są używane do dołączania programów obsługi zdarzeń dla zdarzeń kierowanych.
Warunki wstępne
W tym artykule założono podstawową wiedzę na temat kierowanych zdarzeń i przeczytano Przegląd zdarzeń kierowanych. Aby postępować zgodnie z przykładami w tym artykule, warto zapoznać się z językiem Extensible Application Markup Language (XAML) i wiedzieć, jak pisać aplikacje programu Windows Presentation Foundation (WPF).
Składnia
Składnia deklaracji Sub
, która używa słowa kluczowego Handles, to: Sub <procedure name> Handles <object name>.<event name>
. Ta składnia wyznacza procedurę jako procedurę obsługi zdarzeń, która będzie uruchamiana, gdy zdarzenie określone przez <event name>
jest wywoływane na obiekcie określonym przez <object name>
. Zdarzenie musi być elementem członkowskim klasy obiektu lub klasy bazowej. W poniższym przykładzie pokazano, jak dołączyć procedurę obsługi zdarzeń do elementu XAML przy użyciu Handles
.
' 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
Aby użyć Handles
z obiektem zdefiniowanym w code-behind, zazwyczaj należy zadeklarować obiekt przy użyciu słowa kluczowego WithEvents. Aby uzyskać więcej informacji na temat użycia WithEvents
, zobacz te przykłady. WPF automatycznie deklaruje wszystkie elementy XAML przy użyciu Friend WithEvents
. W poniższym przykładzie pokazano, jak zadeklarować obiekt zdefiniowany w code-behind przy użyciu 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
Aby użyć tej samej procedury obsługi dla wielu zdarzeń, należy rozdzielić przecinkami zdarzenia <object name>.<event name>
. Na przykład Sub Button_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click, Button2.Click
. Kolejność zdarzeń rozdzielanych przecinkami jest niematerialna.
Można przypisać różne programy obsługi dla tego samego zdarzenia za pomocą wielu instrukcji Handles
. Kolejność instrukcji Handles
nie określa kolejności, w jakiej procedury obsługi są wywoływane, gdy wystąpi zdarzenie.
Napiwek
Aby usunąć program obsługi dodany za pomocą Handles
, wywołaj RemoveHandler. Na przykład RemoveHandler Button1.Click, AddressOf Button1_Click
.
Używanie uchwytów w aplikacji WPF
W przypadku obiektu zdefiniowanego w języku XAML obsługuje składnię zdarzeń<object name>.<event name>
wymaga elementu XAML reprezentującego obiekt, który ma właściwość Name lub x:Name. Jednak właściwość name nie jest wymagana dla elementu głównego strony XAML, dla którego można użyć nazwy Me
. W poniższym przykładzie pokazano, jak dołączyć procedurę obsługi zdarzeń do katalogu głównego strony XAML przy użyciu Handles
.
' 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
Po skompilowaniu strony XAML każdy element XAML z parametrem Name
lub x:Name
jest zadeklarowany jako Friend WithEvents
. W związku z tym można użyć dowolnego elementu XAML z Handles
.
Napiwek
Funkcja IntelliSense programu Visual Studio pokazuje obiekty, których można używać z Handles
.
Niezależnie od tego, czy program obsługi zdarzeń jest dołączany przy użyciu
Notatka
Nie używaj zarówno atrybutów XAML, jak i Handles
, aby dołączyć tę samą procedurę obsługi zdarzeń do tego samego zdarzenia. W przeciwnym razie program obsługi zdarzeń będzie wywoływany dwa razy dla każdego zdarzenia.
Ograniczenia
Słowo kluczowe Obsługuje ma następujące ograniczenia użycia:
Można użyć
Handles
tylko do dołączenia programu obsługi zdarzeń do obiektu, jeśli zdarzenie jest elementem członkowskim klasy obiektu lub klasy bazowej. Na przykład można użyćHandles
, aby dołączyć obsługiwacz zdarzeń Click do przycisku, którego klasa bazowa ButtonBase zgłasza zdarzenie kierowaneClick
. Jednak jedną z funkcji kierowanych zdarzeń jest to, że przechodzą przez drzewo elementów, co umożliwia nasłuchiwanie i obsługę zdarzeniaClick
na poziomie wyższym niż element, który je wywołał. Zdarzenie kierowane, które element nadrzędny nasłuchuje i obsługuje, nazywane jest zdarzeniem dołączonym .Handles
nie można używać w przypadku dołączonych zdarzeń, ponieważ jego składnia nie obsługuje określania innego odbiornika w drzewie elementów XAML niż element, który wywołał zdarzenie. Aby przypisać procedury obsługi zdarzeń dla dołączonych zdarzeń, należy użyć składni atrybutów XAML lub metody AddHandler. Aby uzyskać więcej informacji na temat dołączonych zdarzeń, zobacz omówienie zdarzeń dołączonych i Dołączonych zdarzeń w programie WPF.Handles
składnia nie obsługuje wywołania obsługi zdarzeń dla zdarzeń Handled. Aby umożliwić wywoływanie procedury obsługi zdarzeń dla zdarzeńHandled
, dołącz ją przy użyciu metody AddHandler(RoutedEvent, Delegate, Boolean) i ustaw jej parametrhandledEventsToo
natrue
.
Zobacz też
- AddHandler
- Oznaczanie skierowanych zdarzeń jako obsłużonych i obsługa klasowa
- Przegląd zdarzeń trasowanych
- Omówienie powiązanych zdarzeń
- XAML w WPF
.NET Desktop feedback