在WPF中,命令是什么呢?对于程序来说,命令就是一个个任务,例如保存,复制,剪切这些操作都可以理解为一个个命令。即当我们点击一个复杂按钮时,此时就相当于发出了一个复制的命令,即告诉文本框执行一个复杂选中内容的操作,然后由文本框控件去完成复制的操作。在这里,复杂按钮就相当于一个命令发送者,而文本框就是命令的执行者。它们之间通过命令对象分割开了。如果采用事件处理机制的话,此时调用程序与处理程序就相互引用了。
另外,WPF命令除了使命令源和命令目标分割的优点外,它还具有另一个优点:使得控件的启用状态和相应的命令状态保持同步,即命令被禁用时,此时绑定命令的控件也会被禁用。
WPF命令模型的核心就在于iCommand接口了,该接口定义命令的工作原理。该接口的定义如下所示:
public interface ICommand
{
// Events
event EventHandler CanExecuteChanged;
// Methods
bool CanExecute(object parameter);
void Execute(object parameter);
}
该接口包括2个方法和一个事件,下面介绍了如何使用WPF命令来完成任务。XAML具体实现代码如下所示:
<StackPanel>
<Menu>
<MenuItem Header="File">
<!--WPF内置命令都可以采用其缩写形式-->
<MenuItem Command="New"></MenuItem>
</MenuItem>
</Menu>
<!--获得命令文本的两种方式-->
<!--直接从静态的命令对象中提取文本-->
<Button Margin="5" Padding="5" Command="ApplicationCommands.New" ToolTip="{x:Static ApplicationCommands.New}">New</Button>
<!--使用数据绑定,获得正在使用的Command对象,并提取其Text属性-->
<Button Margin="5" Padding="5" Command="ApplicationCommands.New" Content="{Binding RelativeSource={RelativeSource Self},Path=Command.Text}"/>
<Button Margin="5" Padding="5" Visibility="Visible" Click="cmdDoCommand_Click" >DoCommand</Button>
</StackPanel>
其对应的后台代码实现如下所示:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
后台代码创建命令绑定
//CommandBinding bindingNew = new CommandBinding(ApplicationCommands.New);
//bindingNew.Executed += NewCommand;
将创建的命令绑定添加到窗口的CommandBindings集合中
//this.CommandBindings.Add(bindingNew);
}
private void NewCommand(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("New 命令被触发了,命令源是:" + e.Source.ToString());
}
private void cmdDoCommand_Click(object sender, RoutedEventArgs e)
{
// 直接调用命令的两种方式
ApplicationCommands.New.Execute(null, (Button)sender);
//this.CommandBindings[0].Command.Execute(null);
}
}
上面程序的运行结果如下图所示: