电脑技术学习

了解WPF中的路由事件和命令

dn001

要想尽快熟悉 Windows? Presentation Foundation (WPF),必须要面对的一个难题是有许多需要掌握的新结构。甚至 Microsoft? .NET Framework 属性和事件这类简单的事物,在 WPF 中也有新的对应项,功能有所更新且更为复杂——尤其是依赖关系属性和路由事件,这一特点更为显著。还有就是那些全新的内容,如动画、样式设定、控制模板和路由命令等。要学习的东西太多了。

在 本文中,我将重点介绍两个极为重要的 WPF 新元素项。这两个元素项就是相互关联的路由事件和路由命令。它们是用户界面上不同部件进行通信的基础——这些部件可以是一个大的 Window 类的单个控件,也可以是用户界面上单独分离部件的控件及其支持代码。在本文中,我假定您已经对 WPF 有了一定的了解,比如说,知晓如何使用内置 WPF 控件并通过以 XAML 声明 UI 布局来构建 UI。

路由事件概述

刚开始接触 WPF 时,您可能会在自己并不知晓的情况下就用到了路由事件。例如,当您在 Visual Studio? 设计器中向窗口添加一个按钮,并将其命名为 myButton,然后双击该按钮时,Click 事件将挂接在您的 XAML 标记之内,它的事件处理程序会添加到 Window 类的代码隐藏中。这种感觉与在 Windows 窗体和 ASP.NET 中挂接事件并无二致。实际上,它比较接近 ASP.NET 的代码编写模型,但更类似 Windows 窗体的运行时模型。具体来说,在按钮的 XAML 标记中,代码的结尾类似如下所示:

<Button Name="myButton" Click="myButton_Click">Click Me</Button>

挂 接事件的 XAML 声明就象 XAML 中的属性分配,但结果是针对指定事件处理程序的对象产生一个正常的事件挂接。此挂接实际上出现在编译时生成的窗口局部类中。要查看这一挂接,转到类的构造 函数,右键单击 InitializeComponent 方法调用,然后从上下文菜单中选择“转到定义。编辑器将显示生成的代码文件(其命名约定为 .i.g.cs 或 .i.g.vb),其中包括在编译时正常生成的代码。在显示的局部类中向下滚动到 Connect 方法,您会看到下面的内容:

#line 6 "....Window1.xaml" this.myButton.Click += new System.Windows.RoutedEventHandler( this.myButton_Click);这一局部类是在编译时从 XAML 中生成的,其中包含那些需要设计时编译的 XAML 元素。大部分 XAML 最终都会成为编译后程序集中嵌入了二进制的资源,在运行时会与二进制标记表示的已编译代码合并。

如果看一下窗口的代码隐藏,您会发现 Click 处理程序如下所示:

private void myButton_Click(

object sender, RoutedEventArgs e) { }到 目前为止,它看起来就象任何其他 .NET 事件挂接一样——您有一个显式声明的委托,它挂接到一个对象事件且委托指向某个处理方法。使用路由事件的唯一标记是 Click 事件的事件参数类型,即 RoutedEventArgs。那么路由事件究竟有何独特之处呢?要理解这一点,首先需要了解 WPF 元素化的组合模型。