WPF 自定义命令 以及 命令的启用与禁用
自定义命令:
在WPF中有5个命令类(ApplicationCommands、NavigationCommands、EditingCommands、ComponentCommands 以及 MediaCommands)中存储命令,显然不会为应用程序提供所有可能需要的命令,幸运的是,定义自己的命令非常容易。需要的全部工作仅仅是实例化一个新的 RoutedUICommand 对象 即可。
RoutedUICommand 类提供了几个构造函数。虽然可以创建没有任何附加信息的RoutedUICommand对象,但几乎总是希望提供命令名称、命令文本以及属性类型。此外,可能希望为 InputGestures 集合提供快捷键。
最好的设计方式是遵循 WPF 库的范例,并通过静态属性提供自定义的命令。下面的示例定义了一个名为 Requery 的命令:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Input; namespace _1027_CustomCommand
{
public class DataCommands
{
private static RoutedUICommand requery; static DataCommands()
{
//初始化命令
InputGestureCollection inputs = new InputGestureCollection();
inputs.Add(new KeyGesture(Key.R, ModifierKeys.Control, "Ctrl+R"));
requery = new RoutedUICommand("重新查询", "Requery", typeof(DataCommands), inputs);
} public static RoutedUICommand Requery
{
get { return requery; }
}
}
}
这里你可以定义命令的快捷键、命令文本、名称、命令类型。
一旦定义了命令,就可以在命令绑定中使用它,就像使用 WPF 所提供的所有预先构建好的命令那样。至此,我们自定义的命令就完成了。下节继续讲一下关于禁用与启用命令。
WPF命令的启用与禁用:
在命令中都包含有 Executed 事件与 CanExecute 事件,我们需要在 CanExecute 中去处理命令是否启用与禁用。如下代码所示:
private void CommandBinding_CanExecute_1(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = //true or false;
}
我们只需要简单声明一个全局变量 例如:private bool _stopCommand 给 e.CanExecute 赋值即可随时控制。 如果 _stopCommand 值为false,就会禁用命令。如果 _stopCommand 值为true,就会启用命令(如果没有设置 CanExecute 标识,就会保持最近的值 不做任何改变)。
当使用 CanExecute 事件时,我们还需要理解一个问题。由 WPF 负责调用 RoutedCommand.CanExecute() 方法触发事件处理程序,并且确定命令的状态。当 WPF 命令管理器探测到一个确信是重要的变化时——例如,当焦点从一个控件移到另外一个控件上时,或者执行了一个命令之后,WPF 命令管理器就会完成该工作。控件还能引发 CanExecuteChanged 事件以通知 WPF 重新评估命令——例如,当用户在文本框中按下一个键时就会发生该事件。总之,CanExecute 事件会被频繁地触发,并且不应当在该事件中处理耗时的代码。
下面是本文示例的截图与源码:
源码下载:http://files.cnblogs.com/andrew-blog/1027_CustomCommand.rar
开发工具:VS2012
参考:http://www.wxzzz.com/?id=137
最新文章
- OS命令注入中的空格
- uva 147 Dollars
- c++源文件后缀名
- python实现查找指定文件
- c#中如何不通过后台直接用js筛选gridview中的数据条件筛选查询?
- 纯CSS3实现常见多种相册效果
- 基于.NET MVC的高性能IOC插件化架构
- 一套代码小程序&;Web&;Native运行的探索07——mpvue简单调研
- .Net Framework项目引用.NetStandard标准库出现版本冲突解决办法
- js事件不能触发
- Echarts3.0 引入百度地图(转载)
- Django中各目录文件的作用
- jQuery 往table添加新内容有以下四个方法:
- time,datetime,时间戳 时间格式转换
- matlab与VC6.0混合编程设置
- shell的uniq命令
- jquery获取前一个月日期
- JS高级. 03 混入式继承/原型继承/经典继承、拓展内置对象、原型链、创建函数的方式、arguments、eval、静态成员、实例成员、instanceof/是否在同一个原型链
- Scala实战高手****第5课:零基础实战Scala函数式编程及Spark源码解析
- Sqoop Import HDFS