WPF的命令Command主要解决的问题,就是代码复用。一个很重要的应用意义,在于它将很多地方需要的调用的相同操作,以统一的方式管理,却又提供了不同的访问结果。

举个例子来说,我可能通过“点击button”、“右键菜单”、“菜单栏选项”三种方式来访问同一个打印文件的方法。

相同之处:打印文件——这也是最根本的要提供的服务。

不同之处:点击button——只打印当前页;右键菜——单打印全部页;菜单栏——全部打印。

这样一个场景,既有相同、又有不同。

先说结果。

Command通过参数CommandParameter来区分不同的调用场景,提供不同的服务。

Command通过CommandBinding来绑定不同的控件需要执行的相同命令。

CommandBinding具体包括了几个要素:

1 CanExecute事件,判断命令是否可以执行,WPF会通过内部机制,自动的使能这些控件,例如button不可点击;菜单变灰等。

2 Executed事件,命令的具体逻辑

这些是命令Command的基础应用。还有两个概念:Command的source和Command的target。这些就不具体讲解了,网上很多。

下面给出具体的代码示例。

 // MyCmds.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input; namespace WpfApplication3
{
public class MyCmds
{
private static RoutedUICommand tcmd; public static RoutedUICommand Tcmd
{
get { return MyCmds.tcmd; }
} static MyCmds()
{
InputGestureCollection inputc = new InputGestureCollection();
inputc.Add(new KeyGesture(Key.O, ModifierKeys.Control, "Ctrl+O"));
tcmd = new RoutedUICommand("TCmd", "TCmd", typeof(MyCmds), inputc);
}
}
}
 // MainWindow.xaml

 <Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cmd="clr-namespace:WpfApplication3"
Title="MainWindow" Height="" Width="">
<StackPanel>
<Menu>
<MenuItem Header="File">
<MenuItem Command="cmd:MyCmds.Tcmd"></MenuItem>
</MenuItem>
</Menu>
<TextBox x:Name="txtparams" ></TextBox>
<Grid Height="">
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Button x:Name="click" Command="cmd:MyCmds.Tcmd" CommandParameter="{Binding ElementName=txtparams,Path=Text}" Grid.Row="">Click</Button>
<Button x:Name="newbtn" Command="cmd:MyCmds.Tcmd" Grid.Row="">newbtn</Button>
</Grid> </StackPanel>
</Window>
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 WpfApplication3
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
CommandBinding binding = new CommandBinding(MyCmds.Tcmd);
binding.CanExecute += binding_CanExecute;
binding.Executed += binding_Executed;
this.CommandBindings.Add(binding);
} void binding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
} void binding_Executed(object sender, ExecutedRoutedEventArgs e)
{
if (string.IsNullOrEmpty((string)e.Parameter))
{
MessageBox.Show("hello cmds");
}
else if (e.Parameter.ToString() == "lib")
{
MessageBox.Show("lib");
}
else if (e.Parameter.ToString() == "com")
{
MessageBox.Show("com");
}
else
{
MessageBox.Show("stupid");
}
}
}
}

WPF 命令的简单总结的更多相关文章

  1. 八,WPF 命令

    WPF命令模型 ICommand接口 WPF命令模型的核心是System.Windows.Input.ICommand接口,该接口定义了命令的工作原理,它包含了两个方法和一个事件: public in ...

  2. 【WPF学习】第三十一章 WPF命令模型

    WPF命令模型由许多可变的部分组成.总之,它们都具有如下4个重要元素: 命令:命令表示应用程序任务,并且跟踪任务是否能够被执行.然而,命令实际上不包含执行应用程序任务的代码. 命令绑定:每个命令绑定针 ...

  3. WPF快速入门系列(5)——深入解析WPF命令

    一.引言 WPF命令相对来说是一个崭新的概念,因为命令对于之前的WinForm根本没有实现这个概念,但是这并不影响我们学习WPF命令,因为设计模式中有命令模式,关于命令模式可以参考我设计模式的博文:h ...

  4. WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体

    原文:WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体 运行结果: 事实上很简单,定义好一个正方体,处理好纹理.关于MeshGeometry3D的正确定义和纹理这里就不多讲 ...

  5. Wpf(Storyboard)动画简单实例

    原文:Wpf(Storyboard)动画简单实例 动画的三种变换方式 RotateTransform:旋转变换变化值:CenterX围绕转的圆心横坐标 CenterY纵坐标 Angle旋转角度(角度正 ...

  6. DOS命令行简单用法

    DOS命令行简单用法 基本用法 1.cd(回车)从当前目录切回到根目录. 2.dir(回车)列出当前目录下的所有文件. 3.md kkk(回车)在当前目录下创建一个名称为kkk的文件夹. 4.rd k ...

  7. Prism for WPF 搭建一个简单的模块化开发框架 (一个节点)

    原文:Prism for WPF 搭建一个简单的模块化开发框架 (一个节点) 这里我就只贴图不贴代码了,看看这个节点之前的效果 觉得做的好的地方可以范之前的文章看看 有好的建议也可以说说   填充数据 ...

  8. Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单、导航

    原文:Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单.导航 这个实际上是在聊天之前做的,一起写了,也不分先后了 看一下效果图,上面是模块主导航,左侧是模块内菜单,现在加一下隐藏 ...

  9. Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务、WCF消息头添加安全验证Token

    原文:Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务.WCF消息头添加安全验证Token 为什么选择wcf?   因为好像wcf和wpf就是哥俩,,, 为什么选择异步 ...

随机推荐

  1. C语言实现,队列可伸缩

    两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素. 一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空, ...

  2. zTree应用实例详讲

    zTree应用实例详讲(1) 因为项目的需要,要创建一棵动态的文件树,此树除了实现异步获取子节点外,还要实现对树节点的增.删.改.查.移动.重命名.批量删除.批量移动. 每一个操作都要和数据库打交道. ...

  3. asp.net mvc4设置area里面使用相同的 Controller 名称并设置area里的页面为起始页

    asp.net mvc4设置area里面使用相同的 Controller 名称并设置area里的页面为起始页 1.使用重名controller 在asp.net mvc2以后的版本里面,有了area( ...

  4. CSS:用Less实现栅格系统

    CSS:用Less实现栅格系统 背景 公司一直没有专职的前端和美工,Javascript相对来说我熟悉一点,CSS+HTML有四五年没有搞过了,最近要学一下,招聘或和美工配合的时候会有用处. 收集的资 ...

  5. 工具条OutLookBar

    工具条OutLookBar 灰姑娘本身也有自已的优点,但是却可能因为外貌不讨人喜欢,要变成白雪公主却需要有很多勇气和决心去改变自已: 有一颗善良的心 讨人喜爱的外貌 我这里讲的是一个工具条的蜕变过程, ...

  6. bat编程基本知识

    1 声明变量 ::注意=前后不要留空格.随便说一下,在bat中,连续两个冒号表示注释 set var1=test 如果要引用这个变量的话,可以这样写:%var1% 2 echo off/on echo ...

  7. linux常见笔试题

    一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 i节点 来 ...

  8. Execl导入问题之文本转换

    前些天在基础数据的导入过程中,遇到了这样一个问题:数据明明存在,可是就是不识别!给出的错误提示是:该数据对应的外键不存在! 我找出其中的一条数据,在外键表中查询是存在的!问题出在哪里了呢? 从exec ...

  9. 【翻译】在Mac上使用VSCode创建你的第一个Asp.Net Core应用

    Setting Up Your Development Environment 设置你的开发环境 To setup your development machine download and inst ...

  10. 消息推送之androidpn部署

    androidpn客户端的部署在eclipse上,要记住两点: 1.直接导入的项目是上个世纪的lib这个文件夹,要改为libs.否则会报错找不到云云类. 2.如果在虚拟器上测试,要将res/raw/a ...