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

  • 相关阅读:
    jwt
    mybatis的回顾
    swagger
    MySQl总结
    Java异常
    常用Dos命令
    C++初级项目——机房预约系统
    C++中将数字型字符串转变为int类型的方法
    C++中int *a; int &a; int & *a; int * &a
    #define_CRT_SECURE_NO_WARNINGS的用法
  • 原文地址:https://www.cnblogs.com/jefflee/p/5830886.html
Copyright © 2011-2022 走看看