Welcome

首页 / 软件开发 / .NET编程技术 / 《Programming WPF》翻译 第3章 2.处理输入

《Programming WPF》翻译 第3章 2.处理输入2011-09-11 博客园 包建强在Windows应用程序中,又3种基本的用户输入形式:鼠标、键盘和手写板。 同时,还有一种更高级输入方式,其可能来自快捷键、工具栏的按钮、菜单项。

尽管控件担当着主要的输入对象,用户界面的所有元素都可以接受输入。不 必吃惊,这是因为,为了提供外观,控件完全依赖于底层元素的服务,如 Rectangle和TextBlock。因此,在用户界面内的元素类型中,所有的输入机制都 是有用的,我们将要在接下来的章节介绍这些机制。

3.2.1 Routed事件

.Net框架定义了一个标准的机制来暴露事件。一个类可能暴露了一些事件, 每个事件可能有任意数量的订阅者。虽然WPF也使用了这一标准机制,声称其克 服了一个局限:如果一个正常.NET事件没有注册句柄,该事件将被视为无效并忽 略。

考虑一下这对于一个典型的WPF控件意味着什么。大多数控件是由多个可视化 组件组成的。例如,即使你为一个按钮添加了一个非常简单的可视化树,这棵树 包括一个单独的矩形框,以及一条简单的文本,目前有两个元素:文本和矩形框 。不管光标是否在文本或矩形框上,这个按钮都要响应鼠标点击事件。在标 准.NET事件处理模型中,这意味着要为所有元素注册MouseLeftButtonUp事件。

更严重的是使用WPF内容模型。一个按钮并不局限于只有简单文本作为标题, 它可以包含任意标签。示例3-2是一个相当普通的情况,但即使如此,其中仍然 有6个元素:黄色的边框,代表眼睛的两个点,代表嘴的曲线,文本,以及作为 背景的按钮本身。为每一个单独元素关联事件句柄关联,是烦冗而且效率低下的 。幸运的是,这些并不是必需的。

图3-2

WPF使用routed事件,该事件比其他普通事件更为直接。原先的机制是,将委 托句柄关联到激发该事件的元素,调用该句柄。如今,一个rounted事件会调用 所有的关联到已知代码的句柄,从初始元素向上直到用户界面书的根元素。

示例3-1显示了图3-2中按钮的标记。如果Canvas中的一个Elliipse元素接收 到输入,事件路由可以支持Button、Grid、Canvas和Ellispse接收事件,如图3 -3所示。

示例3-1

图3-3