Como adicionar um manipulador de eventos usando código (WPF .NET)
Você pode atribuir um manipulador de eventos a um elemento no Windows Presentation Foundation (WPF) usando marcação ou por trás do código. Embora seja habitual atribuir um manipulador de eventos em Extensible Application Markup Language (XAML), às vezes talvez seja necessário atribuir um manipulador de eventos em code-behind. Por exemplo, use o código quando:
- Você atribui um manipulador de eventos a um elemento após o carregamento da página de marcação que contém o elemento.
- Você adiciona um elemento e atribui o seu manipulador de eventos depois que a página de marcação que conterá o elemento for carregada.
- Você define a árvore de elementos para seu aplicativo inteiramente no código.
Pré-requisitos
O artigo pressupõe um conhecimento básico de eventos roteados e que você leu visão geral de eventos roteados. Para seguir os exemplos neste artigo, isso ajuda se você estiver familiarizado com Extensible Application Markup Language (XAML) e souber como escrever aplicativos Windows Presentation Foundation (WPF).
Sintaxe para atribuição de manipulador de eventos
O C# suporta a atribuição do manipulador de eventos usando:
- O operador
+=
, que também é usado no modelo de manipulação de eventos CLR (Common Language Runtime). - O método UIElement.AddHandler.
O VB suporta a atribuição do manipulador de eventos usando:
- A instrução AddHandler com o operador AddressOf, que também é usado no modelo de manipulação de eventos CLR.
- A Handles palavra-chave na definição do manipulador de eventos. Para obter mais informações, consulte Visual Basic e WPF manipulação de eventos.
- O método UIElement.AddHandler, juntamente com o operador
AddressOf
, para referenciar o manipulador de eventos.
Exemplo
O exemplo a seguir usa XAML para definir um Button chamado ButtonCreatedByXaml
e para atribuir o método ButtonCreatedByXaml_Click
como seu manipulador de eventos Click.
Click
é um evento roteado interno para botões que derivam de ButtonBase.
<StackPanel Name="StackPanel1">
<Button
Name="ButtonCreatedByXaml"
Click="ButtonCreatedByXaml_Click"
Content="Create a new button with an event handler"
Background="LightGray">
</Button>
</StackPanel>
O exemplo usa code-behind para implementar os manipuladores ButtonCreatedByXaml_Click
e ButtonCreatedByCode_Click
e para atribuir o manipulador ButtonCreatedByCode_Click
aos elementos ButtonCreatedByCode
e StackPanel1
. Os métodos do manipulador de eventos só podem ser implementados no 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
Quando ButtonCreatedByXaml
é clicado e seu manipulador de eventos é executado, ButtonCreatedByXaml_Click
programaticamente:
- Adiciona um novo botão chamado
ButtonCreatedByCode
à árvore de elementos XAML já construída. - Especifica as propriedades do novo botão, como o nome, o conteúdo e a cor do plano de fundo.
- Atribui o manipulador de eventos
ButtonCreatedByCode_Click
aButtonCreatedByCode
. - Atribui o mesmo manipulador de eventos
ButtonCreatedByCode_Click
aStackPanel1
.
Quando ButtonCreatedByCode
é clicado:
- O evento Click roteado é gerado em
ButtonCreatedByCode
. - O manipulador de eventos
ButtonCreatedByCode_Click
atribuído aButtonCreatedByCode
é acionado. - O evento
Click
percorre a árvore de elementos atéStackPanel1
. - O manipulador de eventos
ButtonCreatedByCode_Click
atribuído aStackPanel1
é acionado. - O evento roteado
Click
continua na árvore de elementos, potencialmente acionando outros manipuladores de eventosClick
atribuídos a outros elementos percorridos.
O manipulador de eventos ButtonCreatedByCode_Click
obtém as seguintes informações sobre o evento que o disparou:
- O objeto remetente , que é o elemento ao qual o manipulador de eventos está atribuído. O
sender
seráButtonCreatedByCode
primeira vez que o manipulador for executado eStackPanel1
a segunda vez. - O objeto RoutedEventArgs.Source, que é o elemento que originou o evento. Neste exemplo, o
Source
é sempreButtonCreatedByCode
.
Observação
Uma diferença fundamental entre um evento roteado e um evento CLR é que um evento roteado atravessa a árvore de elementos, procurando manipuladores, enquanto um evento CLR não atravessa a árvore de elementos e os manipuladores só podem anexar ao objeto de origem que gerou o evento. Como resultado, um evento roteado sender
pode ser qualquer elemento percorrido na árvore de elementos.
Para obter mais informações sobre como criar e manipular eventos roteiro, consulte Como criar um evento roteado personalizado e Manipular um evento roteado.
Ver também
.NET Desktop feedback