爱博体育app粗略明了

命令(Command)

2018/1/10 19:06:35

一声令下能够约束代码,还足以约束步骤逻辑。(事件的作用是发布和传唱一些新闻,对什么样响应事件不做规定,各个接收者能够使用自个儿的行为来响应事件。也正是说事件不具有约束力)

指令系统的中坚要素

·命令(Command):实际上就是贯彻了ICommand接口的类,平日选用最多的是RoutedCommand类
·命令源(Command Source):实现了ICommandResource接口的类(Button)
·命令指标(Command Target):必须是促成了IInputCommand接口的类
·命令关联(Command
Binding):肩负把外围逻辑与命令关联起来,举个例子试行在此以前对命令是或不是足以试行进行判别、命令实施后还只怕有何后续专门的学问等

一声令下的采用

一.开立命令类

即猎取二个完成ICommand接口的类,假使命令与现实事情逻辑毫不相关,则运用WPF类库中的RoutedCommand就能够。假若想获得与业务逻辑相关的专有命令,则需求创造RoutedCommand(大概ICommand)的派生类。

贰.扬言命令实例

爱博体育app,才具:一般景况下,只供给操作三个发令实例与之对应就能够。因而先后中的命令多采用单件情势(Singletone
帕特tern)以减小代码复杂度。

三.点名命令源

命令源拥有命令和命令源多少个属性。
同二个指令能够有五个源。
假诺把命令指派给命令源,命令源就能受命令影响,命令不能够实施的时候作为命令源的控件不可用。革命临官发送命令的措施不尽同样,比方单机双击。

4.内定命令指标

一声令下指标不是命令的品质而是命令源的性质。无论这么些命令源是不是具有宗旨都会收到那些命令。若是未有一点点名命令目的,默觉妥善前规范对象就是命令指标。

5.安装命令关联(命令绑定)

WPf必要CommandBinding在实行前救助剖断是否足以实践,在实行后做一些轩然大波来“打扫沙场”。命令目的向命令关联发送路由事件,命令关联捕捉并管理路由事件,向命令反馈音信。

一.ICommand接口包罗多个章程和1个事变

Execute()方法包涵应用程序逻辑(譬喻打印文书档案);
CanExecute()方法重回命令状态(命令可用重临true,不可用重返false);
CanExecuteChanged事件,命令状态改变时引发,那是提醒连续信号,表示应该调用CanExecute()检查命令状态。

二.RoutedCommand类自动达成ICommmand接口的类

不带有其余应用程序逻辑,只象征命令。为事件冒泡和隧道加多了部分异常的基础结构

三.RoutedUICommand类承继自RoutedCommand类

用于全体文本的吩咐,只增加了Text属性

实行命令

RoutedUIIcommand类未有其余编码的功能,只表示命令。为触发命令,须求有命令源(也可应用代码)。为响应命令,供给有发号施令绑定,命令绑定将实施转载给普通的事件管理程序。

1.命令源

ICommandSource定义了四个属性:
·Command:指向连接的授命,必需
·CommandParameter:提供任何希望随命令发送的数量
·CommandTarget:明确将要其间试行命令的成分
譬如:上面包车型大巴按键使用Command属性连接到ApplicationCommands.New命令:

<Button Command="ApplicationCommands.New">New</Button>
二.发令绑定

明确:
·当命令被触发时试行什么样操作
·怎么样明确命令是还是不是能被试行(可选)
·命令在何地起功效

命令实例:

概念一个限令,使用Button来发送这些命令,当命令送达TextBox时,TextBox被清空(假如未有文字则不发送命令)
·分界面代码:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Command"
    Background="LightBlue" Height="350" Width="525">
<StackPanel x:Name="stackPanel">
    <Button x:Name="button1" Content="Send Command" Margin="5"/>
    <TextBox x:Name="textBoxA" Margin="5,0" Height="100"/>
</StackPanel>
</Window>

·后台代码:

//实现:定义一个命令,使用Button来发送这个命令,当命令送达TextBox时,TextBox被清空(如果没有文字则不发送命令)

namespace WpfApplication1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        InitializeCommand();
    }
    //声明并定义命令
    private RoutedCommand clearCmd = new RoutedCommand("CLear", typeof(MainWindow));

    private void InitializeCommand()
    {
        //把命令赋值给命令源(发送者)并指定快捷键
        this.button1.Command = this.clearCmd;
        this.clearCmd.InputGestures.Add(new KeyGesture(Key.C, ModifierKeys.Alt));//按Alt+C键

        //指定命令目标
        this.button1.CommandTarget = this.textBoxA;

        //创建命令关联
        CommandBinding cb = new CommandBinding();
        cb.Command = this.clearCmd;//只关注与clearCmd相关的事件
        cb.CanExecute += new CanExecuteRoutedEventHandler(cb_CanExecute);
        cb.Executed +=new ExecutedRoutedEventHandler(cb_Executed);

        //把命令关联安置在外围控件上
        this.stackPanel.CommandBindings.Add(cb);
    }

    //当探测命令是否可以执行时,此方法被调用
    void cb_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        if(string.IsNullOrEmpty(this.textBoxA.Text))
        { e.CanExecute = false; }
        else
        { e.CanExecute = true; }

        //避免继续向上传而降低程序性能
        e.Handled = true;
    }

    //当命令送达目标后,此方法被调用
    void cb_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        this.textBoxA.Clear();
        //避免继续向上传而降低程序性能
        e.Handled = true;
    }
}

解释:
·运维程序,在TextBox中输入文字后Button在命令可实市场价格况的景况下形成可用,此时单击Button只怕按Alt+C键,TextBox都会被清空。
·RoutedCommand并不对命令指标做任何操作,而是由CommandBinding操作的。
·无论是探测命令是不是施行也许命令送达指标,都会激励命令指标发送路由事件,那个路由事件会沿着UI成分树向上传递并最终被CommandBinding所捕捉。
·CommandBinding被安装在外头的StackPanel上,CommandBinding起二个侦听器的遵从,而且极度针对clearCmd命令捕捉与其有关的路由事件。
·当CommandBinding捕捉到CanExecute事件,就能调用cb_CanExecute方法判定命令试行基准是不是满意,并举报给命令供其影响命令源的景色;当捕捉到Execute事件,表示命令的Execute方法已经实行了,恐怕说命令已经意义在了命令指标上(RoutedCommand只担任让命令目标激发Executed),则调用Executed方法。
·CommandBingding一定要设置在指令目的的外侧控件上,不然不能够捕捉到CanExecute和Executed等路由事件。

命令库

命令具备“一处评释,随处使用”的表征。便携的命令库包蕴:ApplicationCommands,ComponentCommands,NavigationCommands,MediaCommands,艾德itingCommands.都以静态类。举个例子大家能够直接拿命令库用这个标准命令,无需团结注解:Open,Save,Play,Stop。(属于ApplicationCommand)

自定义Command

———————待更新

相关文章