TOC

This article has been localized into Portuguese by the community.

XAML:

Eventos no XAML

A maioria do frameworks modernos são orientados a evento, inclusive o WPF. Todos os controles, incluindo a própria Janela (que também herda da classe Control) possuem uma variedade de eventos que podem ser invocados. Ao invocar tais eventos sua aplicação será notificada quando de sua ocorrência e poderá reagir aos mesmos.

Existem muitos tipos de eventos, porém alguns mais comumente usados são aqueles que respondem às interações com os usuários usando o mouse ou o teclado. Em muitos controles você vai encontrar eventos tais como KeyDown, KeyUp, MouseDown, MouseEnter, MouseLeave, MoseUp e muitos outros.

Nós sinda vamos olhar mais detalhadamente como os eventos funcionam em WPF, considerando que este é um tópico complexo, porém no momento você precisa apenas saber como conectar um evento de um controle em XAML a uma peça de código no seu arquivo de “code-behind”. Veja o seguinte exemplo;

<Window x:Class="WpfTutorialSamples.XAML.EventsSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="EventsSample" Height="300" Width="300">
	<Grid Name="pnlMainGrid" MouseUp="pnlMainGrid_MouseUp" Background="LightBlue">        
		
    </Grid>
</Window>

Note que nós assinamos o evento de MouseUp do Grid ao escrever um nome de método. Este método precisa ser definido no code-behind, usando a assinatura correta do evento. Neste caso veremos algo parecido com isso:

private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
	MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
}

O evento MouseUp usa um delegate chamado MouseButtonEventHandler, em que você se inscreve. Ele tem dois parâmetros, um sender (o controle que disparou o evento) e um objeto MouseButtonEventArgs que irá conter informações úteis. Nós usaremos esse exemplo para pegar a posição do cursor do mouse e dizê-la ao usuário.

Vários eventos podem usar o mesmo tipo de delegate - para instância, tanto MouseUp quanto MouseDown usa o delegate MouseButtonEventHandler, enquanto que o evento MouseMove usa o delegate MouseEventHandler. Quando definimos o método manipulador de evento, você precisa saber qual delegate ele usa e se você não souber isso, você pode olhar na documentação.

Felizmente, o Visual Studio pode nos ajudar a gerar um manipulador de eventos correto para um evento. O jeito mais fácil de fazer isso é simplesmente escrevendo o nome do evento no XAML e deixar o IntelliSense do VS fazer o resto pra você:

Quando você seleciona <New Event Handler> o Visual Studio irá gerar um manipulador de eventos apropriado no seu arquivo Code-behind. Ele será nomeado como <Nome do Controle>_<Nome do Evento>, em nosso caso pnlMainGrid_MouseDown. Clique com botão direito no nome do evento e selecione Navigate to Event Handler e o VS te levará direto para ele.

Inscrevendo-se em um evento a partir do Code-behind.

O jeito mais comum de se assinar em um evento é explicado logo abaixo, mas existem vezes em ao invés disso você irá querer assinar um evento diretamente pelo Code-behind. Isso é feito usando a sintaxe C# do +=, quando você adiciona um objeto manipulador de evento diretamente em um evento. A explicação completa disso precisaria de um exemplo em C# dedicado, mas para comparação, temos aqui um exemplo:

using System;
using System.Windows;
using System.Windows.Input;


namespace WpfTutorialSamples.XAML
{
	public partial class EventsSample : Window
	{
		public EventsSample()
		{
			InitializeComponent();
			pnlMainGrid.MouseUp += new MouseButtonEventHandler(pnlMainGrid_MouseUp);
		}

		private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
		{
			MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
		}

	}
}

Mais uma vez, você precisa saber qual delegate usar, e mais uma vez, o Visual Studio pode lhe ajudar com isso. Assim que você escrever:

pnlMainGrid.MouseDown +=

O Visual Studio lhe oferecerá sua assistência:

Simplesmente pressione a tecla [Tab] duas vezes para que o Visual Studio gere o manipulador de eventos correto para você, logo abaixo do método atual, pronto para implementação. Quando você assina o evento como este, você não precisa fazer isso no XAML.