《深入浅出WPF》学习笔记之深入浅出话命令

命令系统涉及的对象

命令对象,实现了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就足够了。如果需要也可以实现自己的命令类。

原文地址:https://www.cnblogs.com/jefflee/p/5830886.html