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

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

见影,我们来看一个简单的示例。在图 3 中,您可看到一个简单的 UI,它有两个输入文本框,一个对文本框中的文本执行 Cut 操作的工具栏按钮。


图3包含Cut命令工具栏按钮的简单示例

    要 使用事件完成挂接,需要为工具栏按钮定义 Click 处理程序,且该代码需要引用两个文本框。您需要根据控件中的文本选择确定哪个文本框是焦点项并调用相应的剪贴板操作。还要根据焦点项的位置和文本框中是否 有选项,在适当的时候启用或禁用工具栏按钮。代码十分凌乱且复杂。

    对于这一简单示例,问题还不大,但如果这些文本框深入用户控件或自定义控件的内部,且窗口代码隐藏无法直接访问它们,情况又会如何?您不得不在用户控件的边界显示 API 以便能从容器实现挂接,或公开显露文本框,两者皆不是理想的方法。

    如使用命令,只需将工具栏按钮的 Command 属性设为在 WPF 中定义的 Cut 命令即可。

    <ToolBar DockPanel.Dock="Top" Height="25"> <Button Command="ApplicationCommands.Cut"> <Image Source="cut.png"/>

    </Button>

    </ToolBar>

    现在您运行应用程序,会看到工具栏按钮一开始是被禁用的。在其中一个文本框中选择了文本后,工具栏按钮会启用,如果单击该按钮,文本会被剪切到剪贴板。这一操作适用于 UI 中任何位置的任何文本框。喔,很不错吧?

    实际上,TextBox 类实现有一个针对 Cut 命令的内置命令绑定,并为您封装了该命令(Copy 和 Paste)的剪贴板处理。那么,命令如何只调用所关注的文本框,消息如何到达文本框并告诉它处理命令?这便是路由命令中路由部件发挥作用的地方。

上一页  [1] [2] [3] [4] [5] [6] 下一页

 

    命令路由

    路由命令与路由事件的区别在于命令从其调用程序路由至处理程序的方法。具体来说,路由事件是从幕后在命令调用程序和处理程序之间路由消息(通过将其挂接至可视树中的命令绑定)。

    这 样,众多元素间都存在关联,但在任何时刻都实际只有一个命令处理程序处于活动状态。活动命令处理程序由可视树中命令调用程序和命令处理程序的位置、以及 UI 中焦点项的位置共同决定。路由事件用于调用活动命令处理程序以询问是否应启用命令,并调用命令处理程序的 Executed 方法处理程序。

    通 常,命令调用程序会在自己在可视树中的位置与可视树根项之间查找命令绑定。如找到,绑定的命令处理程序会确定是否启用命令并在调用命令时一并调用其处理程 序。如果命令挂接到工具栏或菜单中的一个控件(或将设置 FocusManager.IsFocusScope = true 的容器),则会运行一些其他的逻辑,沿可视树路径从根项到命令绑定的焦点元素进行查看。

    在图 3 的简单应用程序中,实际发生的情况是:由于 Cut 命令按钮位于工具栏内,所以由具备焦点项的 TextBox 实例处理 CanExecute 和 Execute。如图 3 中的文本框包含在用户控件之内,您就有机会对窗口、包含 Grid 的用户控件、包含文本框的用户控件或单个文本框设置命令绑定。有焦点项的文本框将确定其路径的终点(它的起点是根项)。

    要理解 WPF 路由命令的路由,需要认识到一旦调用一个命令处理程序,就不能再调用其他处理程序。因此,如果用户控件处理 CanExecute 方法,就不会再调用 TextBox CanExecute 实现。

    定义命令

    ApplicationCommands.Save 和 ApplicationCommands.Cut 是 WPF 提供的诸多命令中的两个命令。图 4 中显示了 WPF 中五个内置命令类及其所包含的一些命令示例。

    图4 WPF命令类

    命令类示例命令

    ApplicationCommands Close、Cut、Copy、Paste、Save、Print

    NavigationCommands

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

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