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
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
Windows Presentation Foundation presenta los RoutedEvents como un nuevo tipo de eventos que pueden invocar
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
En efecto para eso sirve el bubbling
Gracias por el post,muy bueno.