WPF中的Command命令详解

在WPF中使用命令的步骤很简单

1.创建命令

2.绑定命令

3.设置命令源

4.设置命令目标

WPF中命令的核心是System.Windows.Input.ICommand接口,所有命令对象都实现了此接口。当创建自己的命令时,不能直接实现ICommand接口,而是要使用System.Windows.Input.RouteCommand类,该类已经实现了ICommand接口,所有WPF命令都是RouteCommand类的实例。在程序中处理的大部分命令不是RoutedCommand对象,而是RoutedUICommand类的实例,它继承自RouteCommand类。

WPF提供了一个命令库,命令库中提供了多个常用的命令,命令库通过5个专门的静态类的静态属性来提供。

5个静态类分别为:

ApplicationCommands 该类提供通用命令,包括Copy、Cut、Paste等等。

NavigationCommands 该类提供了导航的命令。

EditingCommands 该类提供了很多主要的文档编辑命令 如MoveToLineEnd、MoveLeftByWord等等。

CommponentCommands 该类提供了用户界面元素使用的命令。

MediaCommands 该类提供了一组用于处理多媒体的命令。

通过上面5个静态类的静态属性可以获得常用的命令对象。

下面的XAML示例演示了将命令源关联到按钮,代码如下。

<Window x:Class="WPF命令详解.Window1"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     Title="Window1" Height="300" Width="300" WindowStartupLocation="CenterScreen"
         Loaded="Window_Loaded">
      <Grid>
         <Grid.RowDefinitions>
             <RowDefinition/>
             <RowDefinition/>
             <RowDefinition/>
             <RowDefinition/>
         </Grid.RowDefinitions>
         <Button Grid.Row="0" Command="ApplicationCommands.Open"></Button>
         <Button Grid.Row="1" Command="ApplicationCommands.New"></Button>
         <Button Grid.Row="2" Command="ApplicationCommands.Save"></Button>
         <Button Grid.Row="3" Command="ApplicationCommands.Copy"></Button>
     </Grid>
</Window>

从上面的代码中可以看到,通过Command关联命令对象,当应用程序执行时,会发现按钮都是不可用的,变成了不可用状态与IsEnable属性设置为False一样。这是因为按钮还没有关联绑定,下面看一下关键绑定后的代码如下。

XAML代码如下。

<Window x:Class="WPF命令详解.Window1"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     Title="Window1" Height="300" Width="300" WindowStartupLocation="CenterScreen"
         Loaded="Window_Loaded">
     <Window.CommandBindings>
         <CommandBinding Command="ApplicationCommands.Copy"
                         Executed="CommandBinding_Executed">
         </CommandBinding>
     </Window.CommandBindings>
     <Grid>
         <Grid.RowDefinitions>
             <RowDefinition/>
             <RowDefinition/>
             <RowDefinition/>
             <RowDefinition/>
         </Grid.RowDefinitions>
         <Button Grid.Row="0" Command="ApplicationCommands.Open"></Button>
         <Button Grid.Row="1" Command="ApplicationCommands.New"></Button>
         <Button Grid.Row="2" Command="ApplicationCommands.Save"></Button>
         <Button Grid.Row="3" Command="ApplicationCommands.Copy"></Button>
     </Grid>
</Window>

CS代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WPF命令详解
{
     /// <summary>
     /// Window1.xaml 的交互逻辑
     /// </summary>
     public partial class Window1 : Window
     {
         public Window1()
         {
             InitializeComponent();
         }

         private void Window_Loaded(object sender, RoutedEventArgs e)
         {
             CommandBinding binding = new CommandBinding(ApplicationCommands.New);
             binding.Executed += new ExecutedRoutedEventHandler(binding_Executed);
             CommandBinding cmd_Open = new CommandBinding(ApplicationCommands.Open);
             cmd_Open.Executed += new ExecutedRoutedEventHandler(cmd_Open_Executed);
             CommandBinding cmd_Save = new CommandBinding(ApplicationCommands.Save);
             cmd_Save.Executed += new ExecutedRoutedEventHandler(cmd_Save_Executed);

             this.CommandBindings.Add(binding);
             this.CommandBindings.Add(cmd_Open);
             this.CommandBindings.Add(cmd_Save);
         }

         void cmd_Save_Executed(object sender, ExecutedRoutedEventArgs e)
         {
             MessageBox.Show("保存");
         }

         void cmd_Open_Executed(object sender, ExecutedRoutedEventArgs e)
         {
             MessageBox.Show("打开");
         }

         void binding_Executed(object sender, ExecutedRoutedEventArgs e)
         {
             MessageBox.Show("新建");
         }

         private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
         {
             MessageBox.Show("复制");
         }
     }
}

从上面的代码中可以看到,在XAML代码中可以实现命令绑定。

 <Window.CommandBindings>
         <CommandBinding Command="ApplicationCommands.Copy"
                         Executed="CommandBinding_Executed">
         </CommandBinding>
 </Window.CommandBindings>

也可以在CS代码中实现命令绑定。

 CommandBinding binding = new CommandBinding(ApplicationCommands.New);
             binding.Executed += new ExecutedRoutedEventHandler(binding_Executed);
             this.CommandBindings.Add(binding);

还有就是要写Executed事件中的代码。

 void binding_Executed(object sender, ExecutedRoutedEventArgs e)
         {
             MessageBox.Show("新建");
         }

上面的内容是通过实现了ICommandSource接口的Button控件来触发执行的命令,下面演示了直接调用命令的方式,代码如下。

ApplicationCommands.Open.Execute(null, this);
CommandBindings[0].Command.Execute(null);

第一种方法使用了命令对象的Execute方法调用命令,此方法接收两个参数,第一个参数是传递的参数值,第二个参数是命令绑定的所在位置,示例中使用了当前窗体。

第二种方法在关联的CommandBinding对象中调用Execute方法,对于这种情况不需要提供命令绑定的所在位置,因为会自动将提供正在使用的CommandBindings集合的元素设置为绑定位置。

时间: 2024-10-25 15:55:54

WPF中的Command命令详解的相关文章

命令提示符(cmd)中的tracert命令详解(小技巧)

tracert也被称为Windows路由跟踪实用程序,在命令提示符(cmd)中使用tracert命令可以用于确定IP数据包访问目标时所选择的路径.本文主要探讨了tracert命令的各个功能. 百度经验:jingyan.baidu.com 工具/原料 计算机一台,要求安装Windows操作系统,本例中采用的是Win7版本. 百度经验:jingyan.baidu.com 方法/步骤 1 进入Windows命令提示符程序.Win7系统直接在开始菜单下方的输入框中输入“cmd”或“命令提示符”就可以进入

MySQL中EXPLAIN解释命令详解

MySQL中的explain命令显示了mysql如何使用索引来处理select语句以及连接表.explain显示的信息可以帮助选择更好的索引和写出更优化的查询语句. 1.EXPLAIN的使用方法:在select语句前加上explain就可以了. 如:explain select surname,first_name form a,b where a.id=b.id 2.EXPLAIN列的解释: table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型.从最好到最

命令提示符(cmd)中的tracert命令详解

tracert也被称为Windows路由跟踪实用程序,在命令提示符(cmd)中使用tracert命令可以用于确定IP数据包访问目标时所选择的路径.本文主要探讨了tracert命令的各个功能. 工具/原料 计算机一台,要求安装Windows操作系统,本例中采用的是Win7版本. 方法/步骤 1 进入Windows命令提示符程序.Win7系统直接在开始菜单下方的输入框中输入"cmd"或"命令提示符"就可以进入了.XP系统需要在开始菜单中找到运行(或按下快捷键R),在运行

Memcached中的存取命令详解

本文和大家分享的主要是Memcached中常用的一些存取命令相关用法,一起来看看吧,希望对大家学习Memcached有所帮互助. 存储命令 set:不管key存在与否,强制进行set操作: add:必须在memcached中不存在相应key才能作用: replace:要求memcached中必须存在相应key才能作用: append:将数据追加到key对应value值的末尾.(不允许超过限制,用于管理list) cas(check and set):另一个存储数据的操作,当你最后一次读取该数据后

redis中setbit bitcount命令详解

bitmap,位图,即是使用bit. redis字符串是一个字节序列. 1 Byte = 8 bit SETBIT key offset value 设置或者清空key的value(字符串)在offset处的bit值. 那个位置的bit要么被设置,要么被清空,这个由value(只能是0或者1)来决定.当key不存在的时候,就创建一个新的字符串value.要确保这个字符串大到在offset处有bit值. offset 表示bit的位置数,从0开始计,1字节的bit数组最大为7 . SETBIT K

Linux下的压缩解压缩命令详解

zip -r myfile.zip ./*将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzipunzip -o -d /home/sunny myfile.zip把myfile.zip文件解压到 /home/sunny/-o:不提示的情况下覆盖文件:-d:-d /home/sunny 指明将文件解压缩到/home/sunny目录下: 3.其他zip -d myfile.zip smart.txt删除压缩文件中smart.txt文件z

Linux下的压缩zip,解压缩unzip命令详解及实例

Linux下的压缩zip,解压缩unzip命令 本人亲自测试总结: linux 安装unzip zip 安装命令:yum install -y unzip zip # unzip yasuo.zip 方法一: 安装命令:yum install -y unzip zip 1. 我想把一个文件abc.txt和一个目录dir1压缩成为yasuo.zip:# zip -r yasuo.zip abc.txt dir12.我下载了一个yasuo.zip文件,想解压缩: # unzip yasuo.zip

Linux下的压缩解压缩命令详解及实例

实例:压缩当前目录的内容为xxx.zip文件 zip -r xxx.zip ./* 解压zip文件到当前目录 unzip filename.zip ============================ 另:有些服务器没有安装zip包执行不了zip命令,但基本上都可以用tar命令的,实例如下: tar -zcvf /home/zdzlibs.tar.gz /home/zdz/java/zdzlibs/ ============================ linux zip命令 zip -

unzip/tar命令详解

博客目录总纲首页 原文链接:https://www.cnblogs.com/zdz8207/p/3765604.html Linux下的压缩解压缩命令详解及实例 实例:压缩服务器上当前目录的内容为xxx.zip文件 zip -r xxx.zip ./* 解压zip文件到当前目录 unzip filename.zip ============================ 另:有些服务器没有安装zip包执行不了zip命令,但基本上都可以用tar命令的,实例如下: tar -zcvf /home/