Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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. - UIElement.AddHandler-metoden.
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
ButtonCreatedByCodei 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_ClicktillButtonCreatedByCode. - Tilldelar samma
ButtonCreatedByCode_Clickhändelsehanterare tillStackPanel1.
När ButtonCreatedByCode klickas:
- Den Click dirigerade händelsen aktiveras på
ButtonCreatedByCode. - Den
ButtonCreatedByCode_Clickhändelsehanterare som tilldelatsButtonCreatedByCodeutlöses. - Den dirigerade händelsen
Clickgår upp i elementträdet tillStackPanel1. - Den
ButtonCreatedByCode_Clickhändelsehanterare som tilldelatsStackPanel1utlöses. - Den
Clickrouted händelsen fortsätter upp i elementträdet och utlöser potentiellt andraClickhä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.
senderkommer att varaButtonCreatedByCodeförsta gången hanteraren körs, ochStackPanel1andra gången. -
RoutedEventArgs.Source-objektet, vilket är det element som ursprungligen skapade händelsen. I det här exemplet är
SourcealltidButtonCreatedByCode.
Anmärkning
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 elementträdet.
Mer information om hur du skapar och hanterar routade händelser finns i Skapa en anpassad dirigerad händelse och Hantera en dirigerad händelse
Se även
- Översikt över routade händelser
- XAML i WPF
.NET Desktop feedback