Zpracování událostí jazyka Visual Basic a WPF (WPF .NET)

Pokud kódujete v jazyce Visual Basic .NET, můžete k objektu připojit obslužnou rutinu události pomocí klíčového slova Popisovače specifické pro jazyk. Objekt může být instancí v kódu za kódem nebo elementem jazyka XAML (Extensible Application Markup Language). Handleslze použít k přiřazení obslužných rutin událostí pro události CLR (Common Language Runtime) nebo události směrované službou Windows Presentation Foundation (WPF). Při Handles připojování obslužných rutin událostí pro směrované události ale platí určitá omezení použití.

Důležité

Dokumentace k desktopové příručce pro .NET 7 a .NET 6 se právě připravuje.

Předpoklady

V článku se předpokládá základní znalost směrovaných událostí a že jste si přečetli přehled směrovaných událostí. Pokud chcete postupovat podle příkladů v tomto článku, pomůže vám to, pokud znáte jazyk XAML (Extensible Application Markup Language) a víte, jak psát aplikace WINDOWS Presentation Foundation (WPF).

Syntaxe

Syntaxe deklarace Sub , která používá klíčové slovo Handles , je: Sub <procedure name> Handles <object name>.<event name>. Tato syntaxe určuje proceduru jako obslužnou rutinu události, která se spustí, když je vyvolána událost určená <event name> objektem určeným <object name>. Událost musí být členem třídy objektu nebo základní třídy. Následující příklad ukazuje, jak připojit obslužnou rutinu události k elementu XAML pomocí 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

Chcete-li použít Handles s objektem definovaným v kódu na pozadí, obvykle deklarujete objekt pomocí klíčového slova WithEvents . Další informace o WithEvents využití najdete v těchto příkladech. WPF automaticky deklaruje všechny elementy XAML pomocí Friend WithEvents. Následující příklad ukazuje, jak deklarovat objekt definovaný v kódu pomocí .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

Chcete-li použít stejnou obslužnou rutinu pro více událostí, oddělte <object name>.<event name> tyto události čárkami. Například, Sub Button_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click, Button2.Click. Pořadí událostí oddělených čárkami je neměnné.

Pro stejnou událost můžete přiřadit různé obslužné rutiny s více Handles příkazy. Pořadí Handles příkazů neurčí pořadí, ve kterém jsou obslužné rutiny vyvolány při výskytu události.

Tip

Chcete-li odebrat obslužnou rutinu přidanou pomocí Handlesvolání RemoveHandler. Například, RemoveHandler Button1.Click, AddressOf Button1_Click.

Použití popisovačů v aplikaci WPF

U objektu definovaného v jazyce XAML vyžaduje syntaxe <object name>.<event name> události Handles element XAML, který představuje objekt, aby měl Name vlastnost nebo x:Name. Vlastnost name však není vyžadována pro kořenový prvek stránky XAML, pro který můžete použít název Me. Následující příklad ukazuje, jak připojit obslužnou rutinu události k kořenovému adresáři stránky XAML pomocí 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

Při kompilaci stránky XAML je každý prvek XAML s parametrem Namex:Name deklarován jako Friend WithEvents. V důsledku toho můžete použít libovolný prvek XAML s Handles.

Tip

Visual Studio IntelliSense ukazuje objekty, které lze použít s Handles.

Bez ohledu na to, jestli připojíte obslužnou rutinu události pomocí Handles, syntaxe atributu XAML, příkazu AddHandler nebo AddHandler metody, chování systému událostí je stejné.

Poznámka:

Nepoužívejte oba atributy XAML a Handles připojte stejnou obslužnou rutinu události ke stejné události, jinak se obslužná rutina události zavolá dvakrát pro každou událost.

Omezení

Klíčové slovo Handles má tato omezení použití:

  • K objektu můžete připojit Handles obslužnou rutinu události pouze v případě, že je událost členem třídy objektu nebo základní třídy. Můžete například použít Handles k připojení Click obslužné rutiny události k tlačítku, jehož základní třída ButtonBase vyvolá Click směrovanou událost. Jednou z funkcí směrovaných událostí je ale to, že procházejí stromem prvků, který umožňuje naslouchat a zpracovávat Click událost na vyšší úrovni než prvek, který ho vyvolal. Směrovaná událost, kterou nadřazený prvek naslouchá a zpracovává, se nazývá připojená událost. Handles Nelze použít pro připojené události, protože její syntaxe nepodporuje zadání jiného naslouchacího procesu ve stromu elementu XAML než element, který vyvolal událost. Pokud chcete přiřadit obslužné rutiny událostí pro připojené události, budete muset použít syntaxi atributu XAML nebo metodu AddHandler . Další informace o připojených událostech naleznete v tématu Přehled připojených událostí a Připojené události ve WPF.

  • Handles Syntaxe nepodporuje vyvolání obslužné rutiny událostí pro Handled události. Chcete-li povolit vyvolání obslužné rutiny události pro Handled události, připojte obslužnou rutinu AddHandler(RoutedEvent, Delegate, Boolean) události pomocí metody a nastavte jeho handledEventsToo parametr na true.

Viz také