Udostępnij za pośrednictwem


Obsługa zdarzeń Visual Basic i WPF (WPF .NET)

Jeśli kodujesz na platformie .NET języka Visual Basic, możesz użyć słowa kluczowego Obsługa języka, aby dołączyć program obsługi zdarzeń do obiektu. Obiekt może być wystąpieniem w kodzie lub elementem w języku Extensible Application Markup Language (XAML). HandlesMoże służyć do przypisywania programów obsługi zdarzeń dla zdarzeń środowiska uruchomieniowego języka wspólnego (CLR) lub zdarzeń kierowanych przez program 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.

Wymagania wstępne

W tym artykule przyjęto założenie, że masz podstawową wiedzę na temat zdarzeń kierowanych i zapoznasz się z omówieniem zdarzeń trasowanych. 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 używającej słowa kluczowego Sub 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 po wystąpieniu zdarzenia określonego przez <event name> program 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 polecenia 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żywać z Handles obiektem zdefiniowanym w kodzie, zazwyczaj deklarujesz obiekt za pomocą słowa kluczowego WithEvents . Aby uzyskać więcej informacji na WithEvents temat użycia, zobacz te przykłady. WPF automatycznie deklaruje wszystkie elementy XAML przy użyciu polecenia Friend WithEvents. W poniższym przykładzie pokazano, jak zadeklarować obiekt zdefiniowany w kodzie za pomocą polecenia 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ń, rozdziel zdarzenia <object name>.<event name> przecinkami. 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 z wieloma Handles instrukcjami. Kolejność instrukcji Handles nie określa kolejności wywoływanej procedury obsługi w momencie wystąpienia zdarzenia.

Napiwek

Aby usunąć procedurę obsługi, która została dodana za pomocą Handlesmetody , wywołaj metodę 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 składnia <object name>.<event name> zdarzeń Handles wymaga elementu XAML, który reprezentuje obiekt, aby mieć Name właściwość 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 polecenia 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 or x:Name jest zadeklarowany jako Friend WithEvents. W związku z tym można użyć dowolnego elementu XAML z elementem Handles.

Napiwek

Funkcja IntelliSense programu Visual Studio pokazuje obiekty, których można używać z Handlesprogramem .

Niezależnie od tego, czy program obsługi zdarzeń jest dołączany przy użyciu Handlesskładni atrybutu XAML, instrukcji AddHandler lub AddHandler metody, zachowanie systemu zdarzeń jest takie samo.

Uwaga

Nie używaj zarówno atrybutów XAML, jak i Handles w celu dołączenia tej samej procedury obsługi zdarzeń do tego samego zdarzenia. W przeciwnym razie program obsługi zdarzeń zostanie wywołany dwa razy dla każdego zdarzenia.

Ograniczenia

Słowo kluczowe Handles ma następujące ograniczenia użycia:

  • Program obsługi zdarzeń można dołączyć do obiektu tylko Handles wtedy, gdy zdarzenie jest elementem członkowskim klasy obiektu lub klasy bazowej. Można na przykład użyć Handles polecenia , aby dołączyć procedurę Click obsługi zdarzeń do przycisku, którego klasa ButtonBase bazowa zgłasza Click zdarzenie kierowane. Jednak jedną z funkcji zdarzeń kierowanych jest to, że przechodzą przez drzewo elementów, co umożliwia nasłuchiwanie i obsługę Click zdarzenia na wyższym poziomie niż element, który go podniósł. Zdarzenie kierowane, dla którego element nadrzędny nasłuchuje i obsługuje, jest nazywane dołączonym zdarzeniem. 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 zgłosił zdarzenie. Aby przypisać programy obsługi zdarzeń dla dołączonych zdarzeń, należy użyć składni atrybutu AddHandler XAML lub metody. Aby uzyskać więcej informacji na temat dołączonych zdarzeń, zobacz Omówienie dołączonych zdarzeń i Dołączone zdarzenia w WPF.

  • Handles składnia nie obsługuje wywołania programu obsługi zdarzeń dla zdarzeń Handled . Aby umożliwić wywoływanie programu obsługi zdarzeń dla Handled zdarzeń, dołącz procedurę obsługi zdarzeń przy użyciu AddHandler(RoutedEvent, Delegate, Boolean) metody i ustaw jej handledEventsToo parametr na true.

Zobacz też