zoukankan      html  css  js  c++  java
  • 《深入浅出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就足够了。如果需要也可以实现自己的命令类。

  • 相关阅读:
    C++中使用多线程
    hdu 4223 dp 求连续子序列的和的绝对值最小值
    hdu 1372 bfs 计算起点到终点的距离
    hdu 4217 线段树 依次取第几个最小值,求其sum
    心得
    hdu 1175 bfs 按要求进行搜索,是否能到达,抵消两个(相同)棋子
    hdu 4221 greed 注意范围 工作延期,使整个工作时间罚时最少的单个罚时最长的值
    hdu 2844 多重背包 多种硬币,每一种硬币有一点数量,看他能组成多少种钱
    uva LCDDisplay
    hdu 4218 模拟 根据一个圆点和半径画一个圆 注意半径要求
  • 原文地址:https://www.cnblogs.com/jefflee/p/5830886.html
Copyright © 2011-2022 走看看