Como: Add Class Handling for a Routed Event
Eventos roteados podem ser tratados tanto por tratadores de classe ou tratadores de instância em qualquer nó da rota. Tratadores de classe são chamados em primeiro lugar e podem ser usadas por implementações de classe para suprimir eventos de tratamento da instância ou apresentar outros comportamentos específicos de evento nos eventos pertencentes a classes base. Este exemplo ilustra duas técnicas relacionadas para implementar tratadores de classe.
Exemplo
Este exemplo usa uma classe personalizada com base no painel Canvas. A premissa básica do aplicativo é que a classe personalizada apresenta comportamentos nos seus elementos filho, incluindo interceptação de quaisquer cliques de botão esquerdo do mouse e marca-os como tratados, antes que a classe de elemento filho ou qualquer tratador de instância nele seja chamado.
A classe UIElement expõe um método virtual que permite tratamento de classe no evento PreviewMouseLeftButtonDown, simplesmente sobrescrevendo o evento. Esta é a maneira mais simples para implementar tratamento de classe se tal método virtual estiver disponível em algum lugar na hierarquia de classes. O código a seguir mostra a implementação OnPreviewMouseLeftButtonDown no "MyEditContainer" que é derivado de Canvas "MyEditContainer". A implementação marca o evento como tratada nos argumentos e, em seguida, adiciona algum código para dar ao elemento de origem uma alteração visível básica.
protected override void OnPreviewMouseRightButtonDown(System.Windows.Input.MouseButtonEventArgs e)
{
e.Handled = true; //suppress the click event and other leftmousebuttondown responders
MyEditContainer ec = (MyEditContainer)e.Source;
if (ec.EditState)
{ ec.EditState = false; }
else
{ ec.EditState = true; }
base.OnPreviewMouseRightButtonDown(e);
}
Se nenhum virtual estiver disponível em classes base ou para aquele método em particular, tratamento de classe pode ser adicionado diretamente usando um método utilitário da classe EventManager, RegisterClassHandler. Este método só deve ser chamado de dentro da inicialização estática de classes que estão adicionando tratamento de classe. Este exemplo adiciona um outro tratador para PreviewMouseLeftButtonDown, e nesse caso, a classe registrada é a classe personalizada. Por outro lado, ao usar os virtuais, a classe registrada é realmente a classe base UIElement . Em casos onde tanto classes base e subclasse registram tratamento de classe, os manipuladores de subclasse são chamados primeiro. O comportamento em um aplicativo seria que primeiro esse tratador mostraria sua caixa de mensagem e, em seguida, a alteração visual no manipulador do método virtual seria exibida.
static MyEditContainer()
{
EventManager.RegisterClassHandler(typeof(MyEditContainer), PreviewMouseRightButtonDownEvent, new RoutedEventHandler(LocalOnMouseRightButtonDown));
}
internal static void LocalOnMouseRightButtonDown(object sender, RoutedEventArgs e)
{
MessageBox.Show("this is invoked before the On* class handler on UIElement");
//e.Handled = true; //uncommenting this would cause ONLY the subclass' class handler to respond
}
Consulte também
Tarefas
Conceitos
Marcando Eventos Roteados como Manipulados e Manipulação de Classes
Visão geral sobre eventos roteados