WPF 命令的简单总结
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 命令的简单总结的更多相关文章
- 八,WPF 命令
WPF命令模型 ICommand接口 WPF命令模型的核心是System.Windows.Input.ICommand接口,该接口定义了命令的工作原理,它包含了两个方法和一个事件: public in ...
- 【WPF学习】第三十一章 WPF命令模型
WPF命令模型由许多可变的部分组成.总之,它们都具有如下4个重要元素: 命令:命令表示应用程序任务,并且跟踪任务是否能够被执行.然而,命令实际上不包含执行应用程序任务的代码. 命令绑定:每个命令绑定针 ...
- WPF快速入门系列(5)——深入解析WPF命令
一.引言 WPF命令相对来说是一个崭新的概念,因为命令对于之前的WinForm根本没有实现这个概念,但是这并不影响我们学习WPF命令,因为设计模式中有命令模式,关于命令模式可以参考我设计模式的博文:h ...
- WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体
原文:WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体 运行结果: 事实上很简单,定义好一个正方体,处理好纹理.关于MeshGeometry3D的正确定义和纹理这里就不多讲 ...
- Wpf(Storyboard)动画简单实例
原文:Wpf(Storyboard)动画简单实例 动画的三种变换方式 RotateTransform:旋转变换变化值:CenterX围绕转的圆心横坐标 CenterY纵坐标 Angle旋转角度(角度正 ...
- DOS命令行简单用法
DOS命令行简单用法 基本用法 1.cd(回车)从当前目录切回到根目录. 2.dir(回车)列出当前目录下的所有文件. 3.md kkk(回车)在当前目录下创建一个名称为kkk的文件夹. 4.rd k ...
- Prism for WPF 搭建一个简单的模块化开发框架 (一个节点)
原文:Prism for WPF 搭建一个简单的模块化开发框架 (一个节点) 这里我就只贴图不贴代码了,看看这个节点之前的效果 觉得做的好的地方可以范之前的文章看看 有好的建议也可以说说 填充数据 ...
- Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单、导航
原文:Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单.导航 这个实际上是在聊天之前做的,一起写了,也不分先后了 看一下效果图,上面是模块主导航,左侧是模块内菜单,现在加一下隐藏 ...
- Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务、WCF消息头添加安全验证Token
原文:Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务.WCF消息头添加安全验证Token 为什么选择wcf? 因为好像wcf和wpf就是哥俩,,, 为什么选择异步 ...
随机推荐
- replace()随笔
今天在读jquery源码时,发现一个以前自己不曾注意过得问题,就是replece()的第二个参数为函数时的问题,以前只是知道replace()的第二个参数可以为函数,但是不知道该怎么操作,今天看到源码 ...
- 最简单的linux内存清理方法
vmstat -s 查看剩余内存 然后用一下命令清理内存 echo 1 > /proc/sys/vm/drop_caches
- andoid x项目的优化 1
通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的,一般来说,一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其 ...
- Windows系统架构
操作系统模型 大多数操作系统中,都会把应用程序和内核代码分离运行在不同的模式下.内核模式访问系统数据和硬件,应用程序运行在没有特权的模式下(用户模式),只能使用有限的API,且不能直接访问硬件.当 ...
- [avalon]data-repeat-rendered循环渲染完毕后的回调函数
有些时候需要在渲染完毕后,引用其他类似JQ插件的初始化工作.这时候需要使用data-repeat-rendered的回调函数. 应用场景: 在metro-start界面下,需要给每个tile引用cli ...
- [ios2]如何让IOS应用从容地崩溃 【转】
文/donglin 虽然大家都不愿意看到程序崩溃,但可能崩溃是每个应用必须面对的现实,既然崩溃已经发生,无法阻挡了,那我们就让它崩也崩得淡定点吧. IOS SDK中提供了一个现成的函数 NSSetUn ...
- javascript构造函数以及原型对象的理解
以下是一个构造函数的例子 如果是实例方法,不同的实例化,它们引用的地址是不一样的,是唯一的. //定义一个构造函数 function People(name,age){ this.name=name; ...
- html表单---学习笔记03
第8章 表单 8.1 表单标记<form> <form name="表单名称" method="提交方法" action="处理程序 ...
- LightOJ 1030 Discovering Gold
期望,$dp$. 设$ans[i]$为$i$为起点,到终点$n$获得的期望金币值.$ans[i]=(ans[i+1]+ans[i+2]+ans[i+3]+ans[i+4]+ans[i+5]+ans[i ...
- 用js使得输入框input只能输入数字
JS判断只能是数字和小数点1.文本框只能输入数字代码(小数点也不能输入)<input onkeyup="this.value=this.value.replace(/\D/g, ...