|
Este artigo foi traduzido por máquina. Coloque o ponteiro do mouse sobre as frases do artigo para ver o texto original. Mais informações.
|
Tradução
Original
|
Visão geral sobre eventos roteados
Este tópico contém as seguintes seções.
- Pré-requisitos
- O que é um evento roteado?
- Estratégias de roteamento
- Por que usar eventos roteados?
- Adicionando e implementando um manipulador de eventos para um evento roteado
- Manipuladores por classe
- Eventos anexados no WPF
- Nomes de eventos qualificados em XAML
- Eventos de entrada no WPF
- EventSetters e EventTriggers
- Mais informações sobre eventos roteados
- Tópicos relacionados
<Border Height="50" Width="300" BorderBrush="Gray" BorderThickness="1"> <StackPanel Background="LightGray" Orientation="Horizontal" Button.Click="CommonClickHandler"> <Button Name="YesButton" Width="Auto" >Yes</Button> <Button Name="NoButton" Width="Auto" >No</Button> <Button Name="CancelButton" Width="Auto" >Cancel</Button> </StackPanel> </Border>

Cenários de alto nível para eventos roteados
private void CommonClickHandler(object sender, RoutedEventArgs e) { FrameworkElement feSource = e.Source as FrameworkElement; switch (feSource.Name) { case "YesButton": // do something here ... break; case "NoButton": // do something ... break; case "CancelButton": // do something ... break; } e.Handled=true; }
Como eventos roteados são implementados
Public Shared ReadOnly TapEvent As RoutedEvent = EventManager.RegisterRoutedEvent("Tap", RoutingStrategy.Bubble, GetType(RoutedEventHandler), GetType(MyButtonSimple)) ' Provide CLR accessors for the event Public Custom Event Tap As RoutedEventHandler AddHandler(ByVal value As RoutedEventHandler) Me.AddHandler(TapEvent, value) End AddHandler RemoveHandler(ByVal value As RoutedEventHandler) Me.RemoveHandler(TapEvent, value) End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As RoutedEventArgs) Me.RaiseEvent(e) End RaiseEvent End Event
Manipuladores de eventos roteados e XAML
<Button Click="b1SetColor">button</Button>
Borbulhamento: Manipuladores de eventos na fonte do evento são invocados. O evento roteado, em seguida, encaminha para elementos pai sucessivos até chegar a raiz da árvore de elemento.A maioria dos eventos roteados usam a estratégia de roteamento bolha.Eventos roteados bubbling são geralmente usados para relatar alterações de estado ou entradas de controles distintas ou outros elementos de interface do usuário.Direto: Apenas o elemento fonte em si é terá a oportunidade para chamar manipuladores de resposta. Isso é análogo ao "roteamento" que o Windows Forms usa para eventos. No entanto, diferentemente de um evento CLR padrão, eventos roteados diretos suportam tratamento por classe (tratamento por classe é explicado em uma seção futura) e podem ser usadoa por EventSetter e EventTrigger. Tunelamento: Os manipuladores de evento dos elementos na raiz da árvore de elementos são invocados. O evento roteado, em seguida, passa por uma rota através de sucessivos elementos filhos, em direção ao elemento nó que é a fonte do evento roteado (o elemento que lançou o evento roteado). Eventos roteados por tunelamento são frequentemente usados ou tratados como parte da composição de um controle, de tal modo que eventos de partes da composição possam ser deliberadamente suprimidos ou substituídos por eventos que são específicos ao controle completo. Eventos de entrada fornecidos no WPF geralmente vêm implementados como um par tunelamento/bolha. Eventos por tunelamento são também às vezes chamados de eventos de inspeção prévia ("preview"), por causa de uma convenção de nomeclatura que é usada para os pares.
Determinados recursos de templating e estilo do WPF, como EventSetter e EventTrigger, exigem que o evento referenciado seja um evento roteado. Este é o cenário de identificadores de evento mencionado anteriormente. Eventos roteados suportam um mecanismo de tratamento por classe pelo qual a classe pode especificar métodos estáticos que terão a oportunidade de tratar os eventos roteados antes que qualquer manipulador registrado por instância possa acessá-los. Isso é muito útil no projeto de controles, pois sua classe pode impor comportamentos de classe orientados a eventos que não podem ser acidentalmente suprimidos ao tratar um evento em uma instância.
<Button Click="b1SetColor">button</Button>
void b1SetColor(object sender, RoutedEventArgs args) { //logic to handle the Click event ... }
void MakeButton() { Button b2 = new Button(); b2.AddHandler(Button.ClickEvent, new RoutedEventHandler(Onb2Click)); } void Onb2Click(object sender, RoutedEventArgs e) { //logic to handle the Click event }
void MakeButton2() { Button b2 = new Button(); b2.Click += new RoutedEventHandler(Onb2Click2); } void Onb2Click2(object sender, RoutedEventArgs e) { //logic to handle the Click event }
O conceito de "tratado"
Em código, em vez de usar uma sintaxe de eventos específica de linguagem que funciona para eventos do CLR em geral, chame o método AddHandler(RoutedEvent, Delegate, Boolean) do WPF para adicionar o manipulador. Especifique o valor de handledEventsToo como true. Em um EventSetter, defina o atributo HandledEventsToo como true.
Se um evento roteado estiver marcado como tratado, então ele não precisa ser tratado novamente por outros elementos ao longo da rota. Se um evento roteado não estiver marcado como tratado, então outros ouvintes anteriores na rota ou escolheram não registrar um manipulador, ou os manipuladores que foram registrados decidiram não manipular os dados do evento dados e definir Handled como true. (Ou, é possível que o ouvinte atual seja o primeiro ponto na rota.) Manipuladores no ouvinte atual tem três possíveis cursos de ação: Não executar nenhuma ação; o evento permanece não tratado e é roteado para o próximo ouvinte. Executar código em resposta ao evento, mas determinar que a ação não foi substancial suficiente para garantir que o evento seja marcado como tratado. O evento é roteado para o próximo ouvinte. Executar código em resposta ao evento. Marcar o evento como tratado nos dados do evento passados para o manipulador, pois a ação foi considerada substancial o suficiente para garantir a marcação como tratado. O evento ainda é roteado para o próximo ouvinte, mas com Handled=true nos dados do evento, para que apenas ouvintes handledEventsToo tenham a oportunidade de invocar mais manipuladores.
<Border Height="50" Width="300" BorderBrush="Gray" BorderThickness="1"> <StackPanel Background="LightGray" Orientation="Horizontal" Button.Click="CommonClickHandler"> <Button Name="YesButton" Width="Auto" >Yes</Button> <Button Name="NoButton" Width="Auto" >No</Button> <Button Name="CancelButton" Width="Auto" >Cancel</Button> </StackPanel> </Border>

PreviewMouseDown (tunelamento) no elemento raiz. PreviewMouseDown (tunelamento) no elemento intermediário nº 1. PreviewMouseDown (tunelamento) no elemento origem nº 2. MouseDown (bolha) no elemento origem nº 2. MouseDown (bolha) no elemento intermediário nº 1. MouseDown (bolha) no elemento raiz.
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="SDKSample.EventOvw2" Name="dpanel2" Initialized="PrimeHandledToo" > <StackPanel.Resources> <Style TargetType="{x:Type Button}"> <EventSetter Event="Click" Handler="b1SetColor"/> </Style> </StackPanel.Resources> <Button>Click me</Button> <Button Name="ThisButton" Click="HandleThis"> Raise event, handle it, use handled=true handler to get it anyway. </Button> </StackPanel>