WPF中的Command

WPF提供了Command的支持,具体说就是把copy, paste, undo, open, close, save等操作帮我们代劳了,只需要给菜单项或者button指定一个command,就可以完成这些常用的操作,不需要自己写代码,确实比较方便。

Command分4类,最常用的类是ApplicationCommands,上面列出的command都在这一类。

 

Command又分两种,copy/paste这些命令我们可以不需要写任何代码,WPF完全代劳。Open/Save/Close之类的command就需要我们自己实现内容。后一种让我很困惑,不知道这种情形下为何不直接在OnClick事件中执行不是更方便?

Command有一个功能是自动检测是否可用。比如当前焦点不是在编辑框内,Undo就不能用,对应的菜单变灰;不选中文本,copy菜单就自动变灰。但是对于要自己实现代码的command,就不一样。比如open菜单,如果没有给open命令CommandBindings一个execute函数,这个菜单就永远是灰的,如果绑定了,就是正常可用。需要注意的是,CommandBindings有个有效范围,比如菜单/按钮是在User Control中定义的,在usercontrol1.xaml中给了CommandBindings的定义,usercontrol1.xaml.cs中给了执行函数的实现,但是主窗口没有定义,程序启动时菜单可用,但点击主窗口后,菜单就变灰了

在CommandBinding中可以指定个函数CanExecute来enable/disable菜单或按钮。CanExecute函数在菜单/按钮需要显示给用户时被触发。比如如果是顶级菜单,就是主窗口show时,如果是子菜单,就是父菜单被点开时。但是要注意,这时只有获得焦点的控件才能执行CanExecute函数(如果被绑定了的话)。另外说一下,点击菜单并不会改变当前获得焦点的控件,也就是说菜单被点击时虽然获得了焦点,但是其实不算。

 

下面代码定义command binding

    <Window.CommandBindings>
        <CommandBinding Command="ApplicationCommands.Open"
                  Executed="OpenCmdExecuted"
                  CanExecute="OpenCmdCanExecute"/>
    </Window.CommandBindings>
    <Window.InputBindings>
        <KeyBinding Command="ApplicationCommands.Open" Key="F2" />
        <KeyBinding Command="NotACommand" Key="F1" />
    </Window.InputBindings>

 

Command和传统的Click Event两种方法的比较

一篇老外写的介绍Command的文章,讲得很清晰http://www.devx.com/DevX/Article/37893/0/page/1

假设现在有个菜单项delete,下面有2个listbox,当listitem被选中时delete菜单才会enable。传统做法是在两个listbox的SelectionChanged事件中enable/disable菜单。判断条件除了判断是否有listitem被选中,还同时要判断这个listbox是不是获得焦点

private void lsb_SelectionChanged(object sender,  SelectionChangedEventArgs e)

 

{
    HandleMenus();
}

private void HandleMenus()
{
    menuDelete.IsEnabled = 
         (lsbCustomers.SelectedItem != null && 
         ((ListBoxItem)lsbCustomers.SelectedItem).IsFocused) ||
         (lsbProducts.SelectedItem != null &&
         ((ListBoxItem)lsbProducts.SelectedItem).IsFocused);                            
}


执行删除操作的处理函数也同样要判断

   private void menuDelete_Click(object sender, RoutedEventArgs e)
   {
      if (lsbCustomers.SelectedItem != null &&
         ((ListBoxItem)lsbCustomers.SelectedItem).IsFocused)
            lsbCustomers.Items.Remove(lsbCustomers.SelectedItem);
      else if (lsbProducts.SelectedItem != null &&
         ((ListBoxItem)lsbProducts.SelectedItem).IsFocused)
            lsbProducts.Items.Remove(lsbProducts.SelectedItem);
   }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值