命令

基础点

元素:

  命令: 平时最多使用RoutedCommand,自定义则要实现ICommand接口

  命令源:命令发送者,要求实现了ICommandSource接口的类,界面元素多实现了

  命令目标:命令发送给谁

  命令关联:把命令关联起来。PreviewCanExecute=发生在执行命令是否符合执行的条件判方法前;CanExecute=执行命令是否符合执行的条件判方法;PreviewCanExecute=命令被执行前调用的方法;Executed=命令被执行后调用

 

PreviewCanExecute、CanExecute都是一直在背后运行,调用频繁,让我们看起来是实时的效果,所耗性能,在其方法体要加上e.Handled = true;

 

   命令是一处声明,可处处使用

  命令定义与使用(当文本框内容不为空时,按钮可用,点击按钮后可以清空文本)

   public partial class command1 : Window

    {

        //定义命令

        private RoutedCommand clearCmd = new RoutedCommand("clearCmd", typeof(command1));

        public command1()

        {

            InitializeComponent();

 

            initCommand();

        }

 

        //加载命令

        private void initCommand()

        {

            //把命令赋给命令源,即发送者

            this.button.Command = clearCmd;

            //指定快捷键 Alt+C

            this.clearCmd.InputGestures.Add(new KeyGesture(Key.C, ModifierKeys.Alt));

 

            //命令目标

            this.button.CommandTarget = textBox;

 

            //创建命令关联

            CommandBinding cb = new CommandBinding();

            cb.Command = this.clearCmd;//只关注与clearCmd命令相关的事件

            cb.CanExecute += new CanExecuteRoutedEventHandler(cb_CanExecute);

            cb.Executed += new ExecutedRoutedEventHandler(cb_Executed);

 

            //把命令关联安置在外围控件上,一定要在外围上,否则CanExecute、Executed无法被执行

            grid1.CommandBindings.Add(cb);

        }

 

       

        //当命令发送目标后,此方法会被执行

        private void cb_Executed(object sender, ExecutedRoutedEventArgs e)

        {

            this.textBox.Clear();

 

            //避免继续往上传递降低程序性能 (因为此方法在背后频繁地被调用的)

            e.Handled = true;

        }

 

        //挡探测命令是否可以用时,此方法会被执行

        private void cb_CanExecute(object sender, CanExecuteRoutedEventArgs e)

        {

            if (!string.IsNullOrEmpty(textBox.Text))

            {

                //当文本框内容不为空时

                e.CanExecute = true;

            }

            else {

                e.CanExecute = false;

            }

 

            //避免继续往上传递降低程序性能

            e.Handled = true;

        }

    }

 

 

  预定命令(WPF命令)

CanelPrint Close ContextMenu copy CorrectionList Cut Delete Find Help New NotACommand Open Paste Print PrintPreview Properties Redo Replace Save SaveAs SelectAll Stop Undo

 

 命令参数

多个命令触发同一个命令,因为一个命令是唯 一实例,可以通过命令参数区分

 <Grid x:Name="grid1"  >

        <TextBox x:Name="textBox"  />

        <Button x:Name="button1" Command="New" CommandParameter="button1"  />

        <Button x:Name="button2"  Command="New" CommandParameter="button2"   >

        <ListBox x:Name="listBox" />

    </Grid>

    <Window.CommandBindings>

        <CommandBinding Command="New" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed"></CommandBinding>

    </Window.CommandBindings>

 

  private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)

        {

            if (!string.IsNullOrEmpty(textBox.Text))

            {

                e.CanExecute = true;

            }

            else

            {

                e.CanExecute = false;

            }

 

            e.Handled = true;

        }

 

        private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)

        {

            string name = textBox.Text;

             

                this.listBox.Items.Add("点击者" + e.Parameter.ToString());

        }

 

 

 

 

一个元素只有一个Command属性,要有可变性可结合 Binding使用

 <Button x:Name="button1" Command="{Binding Path=ppp,Source=ss}" CommandParameter="button1" />

 

posted @ 2016-12-31 15:12  evemen  阅读(268)  评论(0编辑  收藏  举报