命令系统涉及的对象
命令对象,实现了ICommand接口的类,使用最多的是RoutedCommand。
命令源,实现了ICommandSource接口的类,大多数可交互的UI元素都实现此接口(如Button)。
命令目标,实现IInputElement接口的类,UIElement元素实现了此接口。
命令关联,为CommandBinding类,提供与命令关联的外围逻辑。
命令的使用过程
创建命令对象,通常使用系统预定义的命令,如ApplicationCommands中的静态成员。或创建自定义命令。
指定命令源,即由谁发送该命令,设定命令对象的.Command属性,同时也可以设置命令的参数。
指定命令目标,在命令源上指定命令目标,通过设置命令源对象的CommandTarget属性指定。
设置命令关联,命令关联一定要设置在命名目标的上层,命令关联用来监听命令目标发出的命令相关事件。注意命令关联只监听指定的命令,通过设置命令关联的Command属性指定要监听的命令。当收到CanExecute事件时用来进行判断是否可以发送命令。当收到Executed事件时表示命令以送达,这时可以执行命令实际要执行的代码或进行一些清理工作。注意当命令源找到命令目标后会频繁激活命令目标的CanExecute事件以确定是否可以发送命令。
通过XAML代码指定命令目标时有些困难,XAML代码片段示例:
<Window.CommandBindings> <CommandBinding Command="ApplicationCommands.Copy" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed"></CommandBinding> </Window.CommandBindings> <StackPanel> <TextBlock x:Name="txtBlock"></TextBlock> <Button Command="ApplicationCommands.Copy" CommandParameter="someArgs"></Button>
C#代码片段:
btnCommand.Command = ApplicationCommands.Delete; btnCommand.CommandParameter = "someArgs"; btnCommand.CommandTarget = textBox; CommandBinding cb = new CommandBinding(); cb.Command = ApplicationCommands.Delete; cb.CanExecute += CommandBinding_CanExecute; cb.Executed += CommandBinding_Executed; root.CommandBindings.Add(cb); private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) { Debug.WriteLine("CommandBinding_CanExecute"); if (!String.IsNullOrEmpty(textBox.Text)) { //设置为命令可发送 e.CanExecute = true; } //避免继续传递事件而降低性能 e.Handled = true; } private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) { Debug.WriteLine("CommandBinding_Executed"); //执行命令完成后的逻辑代码 }
如果不是特别复杂的业务逻辑,只需使用RoutedCommand就足够了。如果需要也可以实现自己的命令类。