WPF执行命令

RoutedUICommand类没有任何硬编码的功能,而是只表示命令,为触发命令,需要有命令源.为响应命令,需要有命令绑定,命令绑定将执行转发给普通的事件处理此程序.

 

命令源

 

命令库的命令始终可用,触发他们最简单的方法是将他们关联到实现了ICommandSource接口的控件,其中包括继承自ButtonBase类的控件,单独的ListBoxItem对象,Hyperlink以及MenuItem

 

例如,下面的按钮使用Command属性连接到ApplicationCommands.New命令

<Button Grid.Row="0" Command="ApplicationCommands.New">new</Button>

 

WPF的智能程度足够高,他能查找前面介绍的所有5个命令容器类,这意味着可使用下面的缩写形式:

<Button Grid.Row="0" Command="New">new</Button>

 

命令绑定

 

当将命令关联到命令源时,会看到一些有趣的现象,命令源将会被自动禁用.

 

为改变这种状态,需要命令创建绑定以明确以下三件事情:

(1)当命令被触发时,执行什么操作

(2)如何确定命令是否被执行(这是可选的,如果未提供这一细节,只要提供了关联的事件处理程序,命令总是可用)

(3)命令在何处起作用,例如,命令可被限制在单个按钮中使用,或在整个窗口中使用(这种情况更常见)

CommandBinding binding = new CommandBinding(ApplicationCommands.New);
binding.Executed += NewCommand_Executed;
this.CommandBindings.Add(binding);

 

注意,上面创建的CommandBinding对象被添加到包含窗口的CommandBinding集合中,这通过事件冒泡进行工作,实际上,当单击按钮时,CommandBinding.Executed事件从按钮冒泡到包含元素

 

尽管习惯上为窗口添加所有绑定,但CommandBindings属性实际是在UIElement基类中定义的,这意味着任何元素都支持该属性,上面的代码假定在同一个类中已有名为NewCommad_Executed的事件处理程序,该处理程序已经准备好接收命令

public void NewCommand_Executed(object sender,ExecutedRoutedEventArgs e)
{
    MessageBox.Show("new command");
}

 

我们也可以使用XAML以声明方式关联命令

 

<Window.CommandBindings>

<CommandBinding Command=”ApplicationCommands.New” Executed=”NewCommand_Executed”></CommandBinding>

</Window.CommandBindings>