问题是,经过我的研究,我仍然无法找到常规路由事件和附加事件之间的区别.功能有什么区别?或者其他人是否同意没有?
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 …Run Code Online (Sandbox Code Playgroud)