天下网吧 >> 网吧方案 >> 网络方案 >> 正文

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

    要想尽快熟悉 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 元素化的组合模型。

    WPF元素树

    如果您在项目中开启一个新窗口并在设计器中将按钮拖入窗口内,您会得到 XAML 格式的元素树,如下所示(为了清楚略去了属性):

    <Window>

    <Grid>

    <Button/>

    </Grid>

    </Window>

    其 中的每个元素都代表对应 .NET 类型的一个运行时实例,元素的声明分层结构形成了所谓的逻辑树。此外,WPF 中的许多控件不是 ContentControl 就是 ItemsControl,这代表他们可以有子元素。例如,Button 是一个 ContentControl,它可以将复杂的子元素做为其内容。您可以展开逻辑树,如下所示:

    <Window>

    <Grid>

    <Button>

    <StackPanel>

    <Image/>

本文来源:天下网吧 作者:网吧方案

相关文章
没有相关文章
声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系Email:support@txwb.com,系统开号,技术支持,服务联系QQ:1175525021本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下