- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
问题是,经过我所有的研究,我仍然找不到常规路由事件和附加事件之间的区别。功能上有什么区别?或者其他人是否同意没有?
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);
}
}
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);
}
这两个事件都在 EventManager 中注册,并以相同的方式存储为公共(public)的、静态的、只读的字段。 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>
这两个事件都可以附加在代码中,如下所示:
// Attach ClickEvent handler.
myGrid.AddHandler(Button.ClickEvent, new RoutedEventHandler(Grid_Click));
// Attach MouseDownEvent handler.
Mouse.AddMouseDownHandler(myGrid, Grid_MouseDown);
如您所见,这两个事件都可以附加到不拥有或声明它们的元素。
MSDN 文档指出: http://msdn.microsoft.com/en-us/library/bb613550.aspx
Extensible Application Markup Language (XAML) defines a language component and type of event called an attached event. The concept of an attached event enables you to add a handler for a particular event to an arbitrary element rather than to an element that actually defines or inherits the event. In this case, neither the object potentially raising the event nor the destination handling instance defines or otherwise "owns" the event.
此外,用于考试 70-511 的官方 MCTS 培训套件 - 使用 Microsoft .NET Framework 4 开发 Windows 应用程序指出:
It is possible for a control to define a handler for an event that the control cannot itself raise. These incidents are called attached events. For example, consider Button controls in a grid. The Button class defines a Click event, but the Grid class does not. However, you can still define a handler for buttons in the grid by attaching the Click event of the Button control in the XAML code.
术语“附加事件”似乎在整个 Microsoft 学习资源中都模糊不清,尽管很明显这里有两个不同但密切相关的概念:附加事件和 XAML 附加事件语法。我引用的两个 Microsoft 来源似乎都指的是 XAML 附加事件语法,而不是实际的附加事件。但是,附加事件概述 MSDN 页面继续向您展示如何实现实际的附加事件,而培训工具包则没有。
Mouse.MouseDownEvent 是在具有相应静态添加和删除处理程序的静态类上声明的路由事件的示例,也称为附加事件。但是,ButtonBase.ClickEvent 是一个普通的路由事件,尽管它仍然可以与 XAML 附加事件语法一起使用,方式与实际附加事件相同。
实际附加事件的目的是它允许开发人员为现有的 UIElement 派生类声明新的路由事件,而不必对它们进行子类化;这意味着您可以只附加新的路由事件,而无需它们实际存在于您想要引发或处理它们的类中。但是,等等……这难道不是纯路由事件的首要目的吗?
MSDN 上的路由事件概述页面指出:http://msdn.microsoft.com/en-us/library/ms742806.aspx
Functional definition: A routed event is a type of event that can invoke handlers on multiple listeners in an element tree, rather than just on the object that raised the event.
从该功能定义看来,任何路由事件本质上都提供与附加事件完全相同的功能。所以基本上,附加事件实际上只是一种在静态类上声明路由事件的方法,与普通路由事件相比并没有真正提供任何好处。
让我知道你的想法,因为我可能在这里遗漏了一些东西。
谢谢,蒂姆·瓦伦丁
最佳答案
区别主要在于句法,两个委托(delegate)引用都由 WPF 的 EventManager 处理,但是附加事件使您能够声明通用功能,而无需膨胀所有类的实现。
在正常路由事件的情况下,该类提供了接口(interface),以便能够在某个时候通过调用事件处理程序来响应事件。但是 WPF 只需要知道它是否是从给定类型派生的对象以及是否已注册处理程序。这意味着我们可以制作更简单的类层次结构,并且还支持开闭原则(Open to Extension,Closed to Modification)。通过这种方式,程序员可以定义几个类应该具有的新行为,而无需修改原始类。
关于c# - WPF 附加事件与非附加事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6198184/
有没有办法在另一个 WPF 窗口内托管 WPF 窗口。我有几个有点复杂的表格。但现在为了简化事情,我试图将其中一些合并为一个“仪表板”表单中的标签页。 请注意,我不是要托管 Windows 窗体,而是
WPF 特有的哪些方面和实践在非 WPF GUI 编程中最有用(并且并非难以实现)? 最佳答案 通过学习 WPF 命令,我了解了命令模式。它构成了 UI - 代码分离的基础,我认为应该在其他应用程序中
WinRT/Metro 正在获得一个新的 SemanticZoom控制,但我很难为 WPF 找到任何东西。 我不想为我的特定项目切换到 Metro,因为它不允许我制作窗口应用程序或跨多个显示器的多个实
我很难解决我的问题,我快要疯了。 想法是这样的:我有两个 ListView 元素,当一个元素从第一个列表掉落到第二个列表时,我需要打开一个对话,但我需要被掉落的元素的信息以及被添加以填充对话的元素。
如果我遵循TabControl,并且一切正常,当我切换到第二个Tabitem时,它显示就没有问题。 //datagrid //datagrid2 但是如果我有这个xaml,当我
在 Windows 窗体应用程序中,我们的数据 GridView 有很多事件,如行鼠标双击或行单击以及额外的...... 但是在 WPF 中我找不到这些事件。我如何将行鼠标双击添加到其中包含数据网格的
在这个项目中,代码 正确编译和执行 ;但是,我需要帮助解决两个问题: VS2012 WPF 设计器不适用于此 XAML 文件。它显示消息设计 View 对于 x64 和 ARM 目标平台不可用。 我收
目前我正在设计 WPF ScrollViewer,我发现了这个 Content="M 0 0 L 4 4 L 0 8 Z" 阅读 MSDN examples .现在我真的很想知道这意味着什么,但我无法
在 WPF 中,元素的可见性可以为“可见”,但实际上在屏幕上不可见,因为它的父元素(或父元素的父元素)具有折叠的可见性。 我希望能够知道一个元素是否实际呈现在屏幕上,而不必遍历可视化树检查父元素。 有
我应该使用 ApplicationCommands.Close用于关闭模式对话框还是该命令被认为是为关闭应用程序保留的?如果是后者,请大家创建Close每个命令 Dialog盒子或只是一个 Close
WPF 是否有任何可用的 piemenu 控件? 最佳答案 我在我的最爱中找到了这个,你可以看看: This 祝你今天过得愉快。 关于wpf - WPF 的菜单,我们在Stack Overflow上找
我正在尝试使用 WrapPanel 和两个 TextBlock 将星号 (*) 附加到某些文本的左侧,允许文本换行,并强制文本右对齐。通过创建一个 FlowDirection 设置为 RightToL
这里是场景(简化):我在Window上有一个控件(比如说一个Rectangle)。我迷上了MouseMove事件,以使其启动拖放操作。然后在MouseDown事件中进行动画处理,向右移动50个像素。但
我有一个 ListView ,它的项目来源是一个列表。我希望用户只选择一项。当我将 listview 的 SelectionMode 设置为 single 时,用户仍然可以选择多个项目,并且似乎 li
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
INotifyPropertyChanged 的目的是什么。我知道每当更改属性时都会触发此事件,但是 View /用户界面如何知道触发了此事件: 这是实现 INotifyPropertyChang
我正在查看工具箱中的 WPF 组件,但找不到 2005/2008 中存在的错误提供程序。 被移除了吗? 最佳答案 ErrorProvider是一个 Winforms 控件。 WPF 中没有等效项。但是
我试图在单击和双击 wpf Image 控件时有不同的行为。不幸的是,单击首先被触发,因此双击被忽略。 最佳答案 如果您改用 MouseDown 事件,则它在 EventArgs 中为 ClickCo
这可能吗? 我使用了一个框架控件并且:显示(例如:showwindow.xaml) 但是我得到这个错误: root element is not valid for navigation 最佳答案 确
我在蓝色背景的窗口上放置了一个扩展器,我想让扩展器的按钮与默认颜色不同(蓝色,它是从窗口接收的)。当我修改扩展器的背景属性时,它会将整个扩展器、标题和全部更改为新颜色。但是,我只想更改按钮本身。谁能指
我是一名优秀的程序员,十分优秀!