Přidání obslužné rutiny 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 vlastní 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 za kódem. Například použijte kód v těchto případech:
- Obslužnou rutinu události přiřadíte elementu za stránkou značek, která obsahuje načtení elementu.
- 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
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 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é rutiny událostí pomocí:
- Příkaz AddHandler s operátorem AddressOf, který se používá také v modelu zpracování událostí CLR.
- Klíčové slovo Handles v definici obslužné rutiny události. Další informace naleznete v tématu Visual Basic a WPF zpracování událostí.
- Metoda UIElement.AddHandler spolu s operátorem
AddressOf
odkazovat na obslužnou rutinu události.
Příklad
Následující příklad používá XAML k definování pojmenovaného Button ButtonCreatedByXaml
a přiřazení ButtonCreatedByXaml_Click
metody jako jeho Click obslužné rutiny události. Click
je integrovaná směrovaná událost pro tlačítka odvozená od 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 kód používá k implementaci ButtonCreatedByXaml_Click
a ButtonCreatedByCode_Click
obslužných rutin a k přiřazení ButtonCreatedByCode_Click
obslužné rutiny k prvkům ButtonCreatedByCode
a StackPanel1
prvkům. Metody obslužné rutiny událostí lze implementovat pouze v kódu.
// 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
Po ButtonCreatedByXaml
kliknutí a spuštění ButtonCreatedByXaml_Click
obslužné rutiny události programově:
- Přidá nové tlačítko pojmenované
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
ButtonCreatedByCode_Click
události .ButtonCreatedByCode
- Přiřadí stejnou obslužnou
ButtonCreatedByCode_Click
rutinu události .StackPanel1
Po ButtonCreatedByCode
kliknutí na:
- Směrovaná Click událost je vyvolána na
ButtonCreatedByCode
. - Aktivuje se
ButtonCreatedByCode_Click
obslužná rutina události přiřazenáButtonCreatedByCode
. - Směrovaná
Click
událost prochází stromem elementu doStackPanel1
. - Aktivuje se
ButtonCreatedByCode_Click
obslužná rutina události přiřazenáStackPanel1
. - Směrovaná
Click
událost pokračuje ve stromu elementů, který potenciálně aktivuje dalšíClick
obslužné rutiny událostí přiřazené jiným procházeným prvkům.
Obslužná ButtonCreatedByCode_Click
rutina události získá následující informace o události, která ji aktivovala:
- Objekt odesílatele , což je prvek, ke kterému je přiřazena obslužná rutina události.
ButtonCreatedByCode
Budesender
prvním spuštěním obslužné rutiny aStackPanel1
druhým časem. - Objekt RoutedEventArgs.Source , což je prvek, který původně vyvolal událost. V tomto příkladu
Source
je 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 důsledku toho může být směrovaná událost sender
libovolným procházeným prvkem ve stromu elementů.
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