Tim*_*ine 25 c# wpf xaml routedevent
问题是,经过我的研究,我仍然无法找到常规路由事件和附加事件之间的区别.功能有什么区别?或者其他人是否同意没有?
ButtonBase类声明一个名为ClickEvent的路由事件; 正常的路由事件.
public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ButtonBase));
[Category("Behavior")]
public event RoutedEventHandler Click
{
add
{
base.AddHandler(ClickEvent, value);
}
remove
{
base.RemoveHandler(ClickEvent, value);
}
}
Run Code Online (Sandbox Code Playgroud)
Mouse类声明一个名为MouseDownEvent的路由事件; 附加活动.
public static readonly RoutedEvent MouseDownEvent = EventManager.RegisterRoutedEvent("MouseDown", RoutingStrategy.Bubble, typeof(MouseButtonEventHandler), typeof(Mouse));
public static void AddMouseDownHandler(DependencyObject element, MouseButtonEventHandler handler)
{
UIElement.AddHandler(element, MouseDownEvent, handler);
}
public static void RemoveMouseDownHandler(DependencyObject element, MouseButtonEventHandler handler)
{
UIElement.RemoveHandler(element, MouseDownEvent, handler);
}
Run Code Online (Sandbox Code Playgroud)
这两个事件都在EventManager中注册,并以相同的方式存储为公共,静态,只读,字段.ClickEvent有一个支持CLR事件字段,带有自定义添加和删除访问器,分别调用base.AddHandler和base.RemoveHandler; 这两个都是在ButtonBase派生自的UIElement基类中声明的.MouseDownEvent有两个静态方法AddMouseDownHandler和RemoveMouseDownHandler,它们最终调用UIElement中声明的两个AddHandler和RemoveHandler方法,就像ClickEvent一样.
在静态类上声明的实际附加事件的Add*Handler和Remove*Handler静态方法必须遵循特定的命名约定,以允许WPF事件系统使用反射在运行时查找适当的添加和删除处理程序.
这两个事件都可以在XAML中附加处理程序,如下所示:
<Grid Button.Click="Grid_Click"
Mouse.MouseDown="Grid_MouseDown">
</Grid>
Run Code Online (Sandbox Code Playgroud)
这两个事件都可以在代码中附加如下:
// Attach ClickEvent handler.
myGrid.AddHandler(Button.ClickEvent, new RoutedEventHandler(Grid_Click));
// Attach MouseDownEvent handler.
Mouse.AddMouseDownHandler(myGrid, Grid_MouseDown);
Run Code Online (Sandbox Code Playgroud)
如您所见,这两个事件都可以附加到不拥有或声明它们的元素上.
MSDN文档声明:http: //msdn.microsoft.com/en-us/library/bb613550.aspx
可扩展应用程序标记语言(XAML)定义了一种称为附加事件的语言组件和事件类型.附加事件的概念使您能够将特定事件的处理程序添加到任意元素,而不是实际定义或继承事件的元素.在这种情况下,可能引发事件的对象和目标处理实例都不定义或"拥有"该事件.
此外,适用于考试70-511的官方MCTS培训套件 - 使用Microsoft .NET Framework 4进行Windows应用程序开发:
控件可以为控件本身无法引发的事件定义处理程序.这些事件称为附加事件.例如,考虑网格中的Button控件.Button类定义了Click事件,但Grid类没有.但是,您仍然可以通过在XAML代码中附加Button控件的Click事件来为网格中的按钮定义处理程序.
在整个Microsoft学习资源中,"附加事件"一词似乎模糊不清,尽管很明显,这里有两个不同但非常密切相关的概念:附加事件和XAML附加事件语法.我引用的两个Microsoft源代码似乎都是指XAML附加事件语法,而不是实际附加事件.但是,附加事件概述MSDN页面会继续向您展示如何实现实际附加事件,而培训工具包则不会.
Mouse.MouseDownEvent是在静态类上声明的路由事件的示例,其中包含相应的静态添加和删除处理程序,也称为附加事件.但是,ButtonBase.ClickEvent是一个正常的路由事件,尽管它仍然可以与实际附加事件一样使用XAML附加事件语法.
实际附加事件的目的是允许开发人员为现有的UIElement派生类声明新的路由事件,而不必对它们进行子类化; 这意味着您可以添加新的路由事件,而不会将它们实际存在于您要引发或处理它们的类上.但是,等一下......首先,这不是一个纯路由事件的主要目的吗?
MSDN上的路由事件概述页面指出:http://msdn.microsoft.com/en-us/library/ms742806.aspx
功能定义:路由事件是一种事件,可以在元素树中的多个侦听器上调用处理程序,而不仅仅是在引发事件的对象上.
从该功能定义看来,任何路由事件似乎基本上提供与附加事件相同的确切功能.所以基本上附加事件实际上只是在静态类上声明路由事件的一种方法,并没有真正提供优于正常路由事件的任何好处.
让我知道你认为,因为我可能在这里遗漏了一些东西.
谢谢,蒂姆瓦伦丁