Lägga till en händelsehanterare med hjälp av kod (WPF .NET)
Du kan tilldela en händelsehanterare till ett element i Windows Presentation Foundation (WPF) med hjälp av markering eller kod bakom. Även om det är vanligt att tilldela en händelsehanterare i XAML (Extensible Application Markup Language) kan du ibland behöva tilldela en händelsehanterare i kod bakom. Använd till exempel kod när:
- Du tilldelar en händelsehanterare till ett element efter markup-sidan som innehåller elementet när den läses in.
- Du lägger till ett element och tilldelar dess händelsehanterare efter att markeringssidan som ska innehålla elementet har laddats.
- Du definierar elementträdet för ditt program helt i kod.
Förutsättningar
Artikeln förutsätter grundläggande kunskaper om routade händelser och att du har läst Översikt över routade händelser. Om du vill följa exemplen i den här artikeln hjälper det om du är bekant med XAML (Extensible Application Markup Language) och vet hur du skriver WPF-program (Windows Presentation Foundation).
Syntax för händelsehanterartilldelning
C# stöder händelsehanterartilldelning med hjälp av:
- Operatorn
+=
, som också används i CLR-händelsehanteringsmodellen. - Metoden UIElement.AddHandler.
VB stöder händelsehanterartilldelning med hjälp av:
- Instruktionen AddHandler med operatorn AddressOf, som också används i CLR-händelsehanteringsmodellen.
- Nyckelordet Hanterar i händelsehanterardefinitionen. Mer information finns i Visual Basic- och WPF-händelsehantering.
- Metoden UIElement.AddHandler tillsammans med
AddressOf
-operatorn för att referera till händelsehanteraren.
Exempel
I följande exempel används XAML för att definiera en Button med namnet ButtonCreatedByXaml
och tilldela metoden ButtonCreatedByXaml_Click
som dess Click händelsehanterare.
Click
är en inbyggd ruterad händelse för knappar som härleds från ButtonBase.
<StackPanel Name="StackPanel1">
<Button
Name="ButtonCreatedByXaml"
Click="ButtonCreatedByXaml_Click"
Content="Create a new button with an event handler"
Background="LightGray">
</Button>
</StackPanel>
I exemplet används kod bakom för att implementera ButtonCreatedByXaml_Click
- och ButtonCreatedByCode_Click
-hanterare och för att tilldela ButtonCreatedByCode_Click
-hanteraren till elementen ButtonCreatedByCode
och StackPanel1
. Händelsehanterarmetoder kan bara implementeras i code-behind.
// 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
När ButtonCreatedByXaml
klickas på och dess händelsehanterare körs, kör ButtonCreatedByXaml_Click
programmatiskt.
- Lägger till en ny knapp med namnet
ButtonCreatedByCode
i det redan konstruerade XAML-elementträdet. - Anger egenskaper för den nya knappen, till exempel namn, innehåll och bakgrundsfärg.
- Tilldelar händelsehanteraren
ButtonCreatedByCode_Click
tillButtonCreatedByCode
. - Tilldelar samma
ButtonCreatedByCode_Click
händelsehanterare tillStackPanel1
.
När ButtonCreatedByCode
klickas:
- Den Click dirigerade händelsen aktiveras på
ButtonCreatedByCode
. - Den
ButtonCreatedByCode_Click
händelsehanterare som tilldelatsButtonCreatedByCode
utlöses. - Den
Click
dirigerade händelsen rör sig uppför elementträdet tillStackPanel1
. - Den
ButtonCreatedByCode_Click
händelsehanterare som tilldelatsStackPanel1
utlöses. - Den
Click
routed händelsen fortsätter upp i elementträdet och utlöser potentiellt andraClick
händelsehanterare som tilldelats andra genomgångna element.
Händelsehanteraren för ButtonCreatedByCode_Click
hämtar följande information om händelsen som utlöste den:
- Avsändarobjektet , vilket är det element som händelsehanteraren har tilldelats.
sender
ButtonCreatedByCode
första gången hanteraren körs ochStackPanel1
andra gången. -
RoutedEventArgs.Source objektet, som är det element som ursprungligen utlöste händelsen. I det här exemplet är
Source
alltidButtonCreatedByCode
.
Not
En viktig skillnad mellan en dirigerad händelse och en CLR-händelse är att en dirigerad händelse passerar elementträdet och letar efter hanterare, medan en CLR-händelse inte passerar elementträdet och hanterare bara kan ansluta till källobjektet som skapade händelsen. Det innebär att en dirigerad händelse sender
kan vara vilket som helst genomgånget element i trädet.
Mer information om hur du skapar och hanterar routade händelser finns i Så här skapar du en anpassad dirigerad händelse och Hantera en dirigerad händelse.
Se även
- översikt över dirigerade händelser
- XAML i WPF
.NET Desktop feedback