代码改变世界

WPF 自定义命令 以及 命令的启用与禁用

2013-09-21 13:48  Andrew.Wangxu  阅读(1998)  评论(0编辑  收藏  举报

自定义命令:

    在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 事件会被频繁地触发,并且不应当在该事件中处理耗时的代码。

 

下面是本文示例的截图与源码:

源码下载:https://files.cnblogs.com/andrew-blog/1027_CustomCommand.rar

开发工具:VS2012

参考:http://www.wxzzz.com/?id=137