Jak přidat obslužnou rutinu události pomocí kódu (WPF .NET)
Obslužnou rutinu události můžete přiřadit elementu ve Windows Presentation Foundation (WPF) pomocí značek nebo kódu na pozadí. I když je obvyklé přiřadit obslužnou rutinu události v XAML (Extensible Application Markup Language), někdy může být nutné přiřadit obslužnou rutinu události v kódu na pozadí. Například použijte kód v těchto případech:
- Přiřadíte obslužnou rutinu události elementu poté, co se načte stránka se značkami, která obsahuje tento element.
- Přidáte prvek a přiřadíte jeho obslužnou rutinu události za stránku značek, která bude obsahovat načtení elementu.
- Strom elementů pro vaši aplikaci definujete zcela v kódu.
Požadavky
Tento článek předpokládá základní znalost trasovaných událostí a že jste si přečetli přehled trasovaný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 přiřazení obslužné rutiny události
Jazyk C# podporuje přiřazení obslužné rutiny události pomocí:
- Operátor
+=
, který se používá také v modelu zpracování událostí CLR (Common Language Runtime). - Metoda UIElement.AddHandler.
VB podporuje přiřazení obslužných rutin událostí pomocí:
- Příkaz AddHandler s operátorem AddressOf, který se používá také v modelu zpracování událostí CLR.
- zpracovává klíčové slovo v definici obslužné rutiny události. Další informace najdete v tématu zpracování událostí ve Visual Basic a WPF.
- Metoda UIElement.AddHandler společně s operátorem
AddressOf
, který odkazuje na obslužnou rutinu události.
Příklad
Následující příklad používá XAML k definování Button pojmenované ButtonCreatedByXaml
a k přiřazení metody ButtonCreatedByXaml_Click
jako své Click obslužné rutiny události.
Click
je integrovaná řízená událost pro tlačítka, která jsou odvozena z ButtonBase.
<StackPanel Name="StackPanel1">
<Button
Name="ButtonCreatedByXaml"
Click="ButtonCreatedByXaml_Click"
Content="Create a new button with an event handler"
Background="LightGray">
</Button>
</StackPanel>
V příkladu se technika code-behind používá k implementaci obslužných rutin ButtonCreatedByXaml_Click
a ButtonCreatedByCode_Click
a k přiřazení obslužné rutiny ButtonCreatedByCode_Click
prvkům ButtonCreatedByCode
a StackPanel1
. Metody obslužné rutiny událostí lze implementovat pouze v kódu na pozadí.
// The click event handler for the existing button 'ButtonCreatedByXaml'.
private void ButtonCreatedByXaml_Click(object sender, RoutedEventArgs e)
{
// Create a new button.
Button ButtonCreatedByCode = new();
// Specify button properties.
ButtonCreatedByCode.Name = "ButtonCreatedByCode";
ButtonCreatedByCode.Content = "New button and event handler created in code";
ButtonCreatedByCode.Background = Brushes.Yellow;
// Add the new button to the StackPanel.
StackPanel1.Children.Add(ButtonCreatedByCode);
// Assign an event handler to the new button using the '+=' operator.
ButtonCreatedByCode.Click += new RoutedEventHandler(ButtonCreatedByCode_Click);
// Assign an event handler to the new button using the AddHandler method.
// AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(ButtonCreatedByCode_Click);
// Assign an event handler to the StackPanel using the AddHandler method.
StackPanel1.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(ButtonCreatedByCode_Click));
}
// The Click event handler for the new button 'ButtonCreatedByCode'.
private void ButtonCreatedByCode_Click(object sender, RoutedEventArgs e)
{
string sourceName = ((FrameworkElement)e.Source).Name;
string senderName = ((FrameworkElement)sender).Name;
Debug.WriteLine($"Routed event handler attached to {senderName}, " +
$"triggered by the Click routed event raised by {sourceName}.");
}
' The click event handler for the existing button 'ButtonCreatedByXaml'.
Private Sub ButtonCreatedByXaml_Click(sender As Object, e As RoutedEventArgs)
' Create a new button and specify button properties.
Dim ButtonCreatedByCode As New Button With {
.Name = "ButtonCreatedByCode",
.Content = "New button and event handler created in code",
.Background = Brushes.Yellow
}
' Add the new button to the StackPanel.
StackPanel1.Children.Add(ButtonCreatedByCode)
' Assign an event handler to the new button using the AddHandler statement.
AddHandler ButtonCreatedByCode.Click, AddressOf ButtonCreatedByCode_Click
' Assign an event handler to the new button using the AddHandler method.
' ButtonCreatedByCode.AddHandler(ButtonBase.ClickEvent, New RoutedEventHandler(AddressOf ButtonCreatedByCode_Click))
' Assign an event handler to the StackPanel using the AddHandler method.
StackPanel1.AddHandler(ButtonBase.ClickEvent, New RoutedEventHandler(AddressOf ButtonCreatedByCode_Click))
End Sub
' The Click event handler for the new button 'ButtonCreatedByCode'.
Private Sub ButtonCreatedByCode_Click(sender As Object, e As RoutedEventArgs)
Dim sourceName As String = CType(e.Source, FrameworkElement).Name
Dim senderName As String = CType(sender, FrameworkElement).Name
Debug.WriteLine($"Routed event handler attached to {senderName}, " +
$"triggered by the Click routed event raised by {sourceName}.")
End Sub
Když je kliknuto na ButtonCreatedByXaml
a jeho obslužná rutina události se spustí, ButtonCreatedByXaml_Click
je spuštěno programově:
- Přidá nové tlačítko s názvem
ButtonCreatedByCode
do již vytvořeného stromu elementů XAML. - Určuje vlastnosti nového tlačítka, například název, obsah a barvu pozadí.
- Přiřadí obslužnou rutinu události
ButtonCreatedByCode_Click
kButtonCreatedByCode
. - Přiřadí stejnou obslužnou rutinu události
ButtonCreatedByCode_Click
keStackPanel1
.
Po kliknutí na ButtonCreatedByCode
:
- Směrovaná událost Click je vyvolána na
ButtonCreatedByCode
. - Obslužná rutina události
ButtonCreatedByCode_Click
přiřazená kButtonCreatedByCode
je spuštěna. - Směrovaná událost
Click
prochází stromem prvků kStackPanel1
. - Obslužná rutina události
ButtonCreatedByCode_Click
, přiřazená kStackPanel1
, je spuštěna. - Směrovaná událost
Click
pokračuje po stromu elementů směrem nahoru, čímž může potenciálně aktivovat další obslužné rutiny událostíClick
přiřazené jiným procházeným prvkům.
Obslužná rutina události ButtonCreatedByCode_Click
získá následující informace o události, která ji aktivovala:
- Odesílatelský objekt , což je prvek, ke kterému je přiřazena obslužná rutina události. Ty
sender
budeButtonCreatedByCode
poprvé, když se spustí obslužná rutina, aStackPanel1
podruhé. - Objekt RoutedEventArgs.Source, což je prvek, který původně vyvolal událost. V tomto příkladu je
Source
vždyButtonCreatedByCode
.
Poznámka
Klíčovým rozdílem mezi směrovanou událostí a událostí CLR je to, že směrovaná událost prochází strom prvků, hledá obslužné rutiny, zatímco událost CLR neprochází stromem elementu a obslužné rutiny se můžou připojit pouze ke zdrojovému objektu, který vyvolal událost. Výsledkem je, že směrovaná událost sender
může být jakýkoliv prvek, který je procházen ve stromu prvků.
Další informace o vytváření a zpracování směrovaných událostí naleznete v tématu Vytvoření vlastní směrované události a Zpracování směrované události.
Viz také
.NET Desktop feedback