Sdílet prostřednictvím


Zpracování událostí ve Visual Basicu 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 specifického pro jazyk Handles. Objekt může být instancí v zákulisním kódu nebo elementem jazyka XAML (Extensible Application Markup Language). Handles lze použít pro přiřazení obslužných rutin událostí pro události CLR (Common Language Runtime) nebo Windows Presentation Foundation (WPF) směrovaných událostí. Handles má ale určitá omezení využití, pokud se používají k připojení obslužných rutin událostí pro směrované události.

Požadavky

Tento článek 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).

Syntax

Syntaxe deklarace Sub, která používá klíčové slovo Handles je: Sub <procedure name> Handles <object name>.<event name>. Tato syntaxe označuje proceduru jako obslužnou rutinu události, která se spustí, když je vyvolána událost určená <event name> na objektu 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

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

Pokud chcete použít stejnou obslužnou rutinu pro více událostí, oddělte <object name>.<event name> 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é.

U jedné události můžete přiřadit různé obslužné rutiny pomocí několika příkazů Handles. Pořadí příkazů Handles neurčí pořadí, ve kterém jsou obslužné rutiny vyvolány při výskytu události.

Spropitné

Chcete-li odebrat obslužnou rutinu přidanou s Handles, zavolejte RemoveHandler. Například RemoveHandler Button1.Click, AddressOf Button1_Click.

Použití popisovačů v aplikaci WPF

U objektu definovaného v jazyce XAML zpracovává syntaxi událostí <object name>.<event name> vyžaduje prvek XAML, který představuje objekt, aby měl vlastnost Name 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 Name nebo x:Name deklarován jako Friend WithEvents. V důsledku toho můžete použít libovolný prvek XAML s Handles.

Spropitné

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 metody AddHandler, chování systému událostí je stejné.

Poznámka

Nepoužívejte oba atributy XAML a Handles k připojení stejné obslužné rutiny 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 připojení obslužné rutiny události k objektu můžete použít pouze Handles, pokud je událost členem třídy objektu nebo základní třídy. Pomocí Handles můžete například připojit obslužnou rutinu události Click k tlačítku, jehož základní třída ButtonBase vyvolá směrovanou událost Click. Jednou z funkcí směrovaných událostí je, že procházejí stromem prvků, což umožňuje zachytit a zpracovávat Click událost na vyšší úrovni než prvek, který jej vyvolal. Směrovaná událost, kterou nadřazený prvek přijímá a zpracovává, se nazývá připojená událost. Handles nelze použít pro přidružené události, protože jeho syntaxe nepodporuje zadání jiného nasluchače v XAML stromu prvků, než je prvek, který událost vyvolal. 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 najdete 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 události Handled. Chcete-li povolit vyvolání obslužné rutiny události pro události Handled, připojte obslužnou rutinu události pomocí metody AddHandler(RoutedEvent, Delegate, Boolean) a nastavte jeho handledEventsToo parametr na true.

Viz také