RoutedEvents en WPF

Windows Presentation Foundation presenta los RoutedEvents como un nuevo
tipo de  eventos que pueden  invocar handlers de  varios  elementos que  esten
escuchando por el en un árbol de elementos.
Como hemos visto hasta ahora, la forma en la que se distribuyen los elementos
en un código XAML es una jerarquía en forma de árbol. Mediante este tipo de
eventos, podemos  lanzar un  evento  en un  elemento  en  el nivel  inferior más
profundo  que  haya  y  “subir”  a modo  de  burbuja  hasta  alcanzar  el  elemento
raiz. Este es el concepto Bubbling muy conocido por los que haya utilizado el
modelo de objetos de DHTML.

Veamos un ejemplo en el siguiente código:

<UserControl x:Class="MyCommands.UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Height="150"> 
    <StackPanel Background="White"> 
        <Border BorderBrush="Black" BorderThickness="1"></Border> 
        <TextBlock FontWeight="Bold"  
                   FontSize="15">User Control1</TextBlock> 
        <Button Click="ButtonLanzar_Click" Width="250"  
                VerticalAlignment="Bottom">Lanzar Evento</Button> 
    </StackPanel> 
</UserControl> 

Si  lanzamos  un  RoutedEvent  desde  el  botón  del  ejemplo  anterior,  dicho
evento  “subirá”  hasta  alcanzar  al  elemento  raiz,  es  decir,  pasará  por: Button
->StackPanel  ->  UserControl.  En  el  caso  que  alguno  de  estos  elementos
estuviese  escuchando  por  este  evento,  podría  lanzar  cualquier  código  ese
momento.

Estrategia de Enrutado

Cuando es definido un RoutedEvent podemos asignar el comportamiento que
tendrá  el  evento  mientras  viaja  a  través  del  árbol  de  elementos.  Para  ello
disponemos  de  los  valores  de  la  enumeración  RoutingStrategy:  Tunneling,
Bubbling y Direct.

Tunneling

En este caso el evento será lanzado en primer lugar desde el elemento raíz del
árbol de elementos e  irá recorriendo cada uno  inmediatamente  inferior hasta
alcanzar al elemento fuente.

Bubbling

A diferencia del  tipo Tunneling, en este  tipo, el evento es  lanzada en primer
lugar  desde  el  elemento  fuente  y  recorrerá  cada  elemento  del  árbol
inmediatamente superior hasta llegar al elemento raíz.

Direct

Con  el mismo  comportamiento que un  evento normal de  .NET. El  evento  es
únicamente lanzado desde el elemento fuente.

 

Si tenemos este código XAML

<Button PreviewMouseDown="PreviewMouseDownButton"
        MouseDown="MouseDownButton">
   <Grid PreviewMouseDown="PreviewMouseDownGrid"
         MouseDown="MouseDownGrid">
      <Grid.ColumnDefinitions>
         <ColumnDefinition />
         <ColumnDefinition />
      </Grid.ColumnDefinitions>
      <Canvas PreviewMouseDown="PreviewMouseDownCanvas"
              MouseDown="MouseDownCanvas"
              Width="20" Height="18" VerticalAlignment="Center">
         <Ellipse PreviewMouseDown="PreviewMouseDownEllipse"
                  MouseDown="MouseDownEllipse"
                  x:Name="myEllipse"
                  Canvas.Left="1" Canvas.Top="1" Width="16" Height="16"
                  Fill="Yellow" Stroke="Black" />
         <Ellipse Canvas.Left="4.5" Canvas.Top="5" Width="2.5" 
                  Height="3" Fill="Black" />
         <Ellipse Canvas.Left="11" Canvas.Top="5" Width="2.5" 
                  Height="3" Fill="Black" />
         <Path Data="M 5,10 A 3,3 0 0 0 13,10" Stroke="Black" />
      </Canvas>
      <TextBlock Grid.Column="1">Click!</TextBlock>
   </Grid>
</Button>

El árbol visual

 

image

Si uno de los elementos Elipse del ejemplo anterior recibe una entrada, el routing de
eventos habilitaría el Button, Grid, Canvas y Ellipse a recibir el evento y dependiendo del tipo

4 comentarios sobre “RoutedEvents en WPF”

  1. Ahora con tu ejemp.o acabo de entender el Bubbling!!!!

    Cuando tienes un control compuesto de varios subcontroles, como el caso que presenta, puede interesar responder al evento clic del ratón desde un solo sitio del control como pueda ser el botón y desde allí ejecutar el código asociado.

    Lo había estudiadio pero no tenía muiy claro para que servía.

    Gracias

Responder a anonymous Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *