自定义命令:

    在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

最新文章

  1. OS命令注入中的空格
  2. uva 147 Dollars
  3. c++源文件后缀名
  4. python实现查找指定文件
  5. c#中如何不通过后台直接用js筛选gridview中的数据条件筛选查询?
  6. 纯CSS3实现常见多种相册效果
  7. 基于.NET MVC的高性能IOC插件化架构
  8. 一套代码小程序&Web&Native运行的探索07——mpvue简单调研
  9. .Net Framework项目引用.NetStandard标准库出现版本冲突解决办法
  10. js事件不能触发
  11. Echarts3.0 引入百度地图(转载)
  12. Django中各目录文件的作用
  13. jQuery 往table添加新内容有以下四个方法:
  14. time,datetime,时间戳 时间格式转换
  15. matlab与VC6.0混合编程设置
  16. shell的uniq命令
  17. jquery获取前一个月日期
  18. JS高级. 03 混入式继承/原型继承/经典继承、拓展内置对象、原型链、创建函数的方式、arguments、eval、静态成员、实例成员、instanceof/是否在同一个原型链
  19. Scala实战高手****第5课:零基础实战Scala函数式编程及Spark源码解析
  20. Sqoop Import HDFS

热门文章

  1. angular学习笔记(十二)-控制器
  2. sublime php插件
  3. Linux下安装Python3.6和第三方库
  4. C# 延时函数 非Sleep
  5. python 合并字典,相同 key 的 value 如何相加?
  6. org.apache.commons
  7. Wpf border 容易弄混的两个属性
  8. 线程池 ManualResetEvent
  9. 【Unity笔记】获得鼠标点击屏幕的位置,并转成世界坐标
  10. 在Window下安装解压版的mysql 5.7.11