揭露WPF SDK“不能说的秘密”
Routed事件
在你不可避免地问“什么是routed事件?”之前,可以去这里看看Routed Events Overview。现在我们解决这个问题了。
不像独立属性,routed事件没有像“这是一个routed事件”之类的习惯性描述。基本元素(UIElement, FrameworkElement, ContentElement, FrameworkContentElement)有很多的routed事件:可能它们的事件有75%都是routed的。其它的类,像控件也会有少数的routed事件,也许和着一些不route的标准CLR事件。为了区分一个事件是否route,你需要在事件主题看看是否有Routed事件信息段。
Routed事件信息段是一个有如下三项的表:
*一个指向包含有routed 事件标志符的域的链接。和属性系统API以及独立属性标志符一样,事件系统API也需要这个标志符以接入事件。像增加或移除句柄一类的简单操作并不是必须标志符,这也是因为routed事件会有一个“包装”,这样就可以支持CLR语言中增加/移除事件句柄的CLR语法。但,如果直接使用AddHandler或调用RaiseEvent,就需要知道routed事件的标志符。
*Routing策略。有三种可能:Bubbling,Tunneling,和Direct。这儿有个小秘密:如果之前查看过事件名字,那么routing策略就总是Tunneling,这是一个惯例。但区分Bubbling和Direct就有点困难了,因为没有不同的命名习惯。所以,我们提供了参照页的信息。Direct事件实际上没有在它的元素之外route,但他们仍然服务于WPF-specific目的,在这里有描述Routed Events Overview。
* Delegate类型。你可以在声明事件的语法中找到列出的delegate。我们在这里重复是为了方便,所以你可以直接跳到“写恰当的句柄”的地方。
附带属性
严格地说,附带属性是XAML的概念,而不是WPF的。但WPF 是第一个发行的采用了XAML语言的工具。所以WPF是用文档来描述XAML语法和XAML语言的先锋。如果你是代码编写员,并看了某个附带属性的叫做DockPanel.Dock的文档,就会注意到一些特别的东西:没有XAML语法,没有代码语法。如果浏览DockPanel类,去看映射或对象就可以证实:对CLR没有类似于“Dock”属性的东西。甚至为了在其它的产生映射的参照中使这个页面存在,SDK开发团队不得不注入这个页面。然而,对我们这些在标记和代码间可以随意转换的人来说,附带属性的语法段确实提供了一个到附带属性的“真实”代码API的链接,这可以成为一系列获取和设置的接入方法。对DockPanel 类来说有 GetDock和SetDock。(不幸的是,在MSDN版本的这些页面中似乎没有这些链接;在Visual Studio和offline Windows SDKs中有…相信我...)
附属事件
类似地,这是一个XAML的概念,但在WPF得到具体的应用。XAML语法,但对同等代码接入来说是一个“秘密”接入方法。在附属事件情况下,这些方法的类型是Add*Handler和Remove*Handler。例如,Mouse.MouseDown调用AddMouseDownHandler就可以有附带到给定的UIElement实例的句柄,并可以通过RemoveMouseDownHandler移除。对实际应用来说,附属事件不一定那么重要,因为大多数都是被UIElement以更方便的方式重新使用而已。但如果你在写一套相关的控件,或者在实现一个服务,那么附属事件就很可能进入你的视野。
0
相关文章