|
Following example I managed to get fire both a RoutedEvent and an AttachedEvent from "GrandChild" and have them handled in "MainWindow" two levels up - but I am now confused what's difference between the two? Except how they are declared in "GrandChild". I want to add that both use "RegisterRoutedEvent" but RoutedEvent has a CLR wrapper
References:
http://weblogs.asp.net/vblasberg/archive/2010/03/30/wpf-routed-events-bubbling-several-layers-up.aspx
http://chuckhays.net/blog/2010/05/21/very-simple-routed-event-example/comment-page-1/#comment-1021
http://en.csharp-online.net/WPF_Concepts%E2%80%94Routed_Events_in_Action
MainWindow - Top Level
<window x:class="RoutedEventDemo.MainWindow"
="" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:RoutedEventDemo" title="MainWindow" height="350" width="525" background="DimGray" local:grandchild.grandchildroutedevclick="GrandChild_GrandChildRoutedEvClick">
<stackpanel local:grandchild.grandchildattachedevclick="GrandChildAttachedEvClickHandler">
<Label>Main Window</Label>
<local:middlechild>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void GrandChild_GrandChildRoutedEvClick(object sender, RoutedEventArgs e)
{
string Message = "MainWindow - GrandChildRoutedEvClickEvent handler - Source=" + Convert.ToString(e.Source);
MessageBox.Show(Message);
e.Handled = false;
return;
}
private void GrandChildAttachedEvClickHandler(object sender, RoutedEventArgs e)
{
string Message = "MainWindow - GrandChildAttachedEvClickHandler - Source=" + Convert.ToString(e.Source);
MessageBox.Show(Message);
return;
}
}
MiddleChild - 2nd Level
<usercontrol x:class="RoutedEventDemo.MiddleChild"
="" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns ="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:RoutedEventDemo" mc:ignorable="d" background="DarkGray" d:designheight="300" d:designwidth="300">
<stackpanel>
<Label>MiddleChild</Label>
<local:grandchild x:name="Junior" verticalalignment="Stretch" grandchildroutedevclick="GrandChild_GrandChildRoutedEvClick">
public partial class MiddleChild : UserControl
{
public MiddleChild()
{
InitializeComponent();
}
private void GrandChild_GrandChildRoutedEvClick(object sender, RoutedEventArgs e)
{
string Message = "MiddleChild - GrandChildRoutedEvClickEvent handler - Source=" + Convert.ToString(e.Source);
MessageBox.Show(Message);
e.Handled = true; // set to true and MainWindow handler won't be triggered
return;
}
}
GrandChild - bottom level
<usercontrol x:class="RoutedEventDemo.GrandChild"
="" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns ="http://schemas.microsoft.com/expression/blend/2008" mc:ignorable="d" background="LightGray" d:designheight="300" d:designwidth="300">
<stackpanel>
<Label>GrandChild</Label>
<Button Name="btnGrandChild" Click="btnGrandChild_Click_1">Button from GrandChild</Button>
public partial class GrandChild : UserControl
{
#region Routed Event
public static readonly RoutedEvent GrandChildRoutedEvClickEvent = EventManager.RegisterRoutedEvent("GrandChildRoutedEvClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(GrandChild));
// Provide CLR accessors for the event
public event RoutedEventHandler GrandChildRoutedEvClick
{
add { AddHandler(GrandChildRoutedEvClickEvent, value); }
remove { RemoveHandler(GrandChildRoutedEvClickEvent, value); }
}
#endregion
#region Attached Event
public static readonly RoutedEvent GrandChildAttachedEvClickEvent =
EventManager.RegisterRoutedEvent("GrandChildAttachedEvClick",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(GrandChild));
public static void AddGrandChildAttachedEvClickHandler(DependencyObject o, RoutedEventHandler handler)
{
((UIElement)o).AddHandler(GrandChild.GrandChildAttachedEvClickEvent, handler);
}
public static void RemoveGrandChildAttachedEvClickHandler(DependencyObject o, RoutedEventHandler handler)
{
((UIElement)o).RemoveHandler(GrandChild.GrandChildAttachedEvClickEvent, handler);
}
#endregion
public GrandChild()
{
InitializeComponent();
}
private void btnGrandChild_Click_1(object sender, RoutedEventArgs e)
{
this.RaiseEvent(new RoutedEventArgs(GrandChildRoutedEvClickEvent, this));
this.RaiseEvent(new RoutedEventArgs(GrandChildAttachedEvClickEvent, this));
return;
}
}
dev
modified 10-Jan-13 2:24am.
|
|
|
|