[转]WPF命令集 Command
在我们日常的应用程序操作中,经常要处理各种各样的命令和进行相关的事件处理,比如需要复制、粘贴文本框中的内容;上网查看网页时,可能需要返回上一网页查看相应内容;而当我们播放视频和多媒体时,我们可能要调节音量,快速拖动到我们想看的片段等等。在Winform编程中,我们经常使用各种各样的控件来解决此类问题,当然我们也必须编写一堆代码来处理各种各样的命令和事件处理。那么,Windows Presentation Foundation (WPF)作为微软新一代图形图像支援系统,它是如何处理这些命令及事件的呢?
在WPF中,许多控件都自动集成了固有的命令集。比如文本框TextBox就提供了复制(Copy),粘贴(Paste),裁切(Cut),撤消(Undo)和重做(Redo)命令等。
WPF提供常用应用程序所用的命令集,常用的命令集包括:ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands和EditingCommands。
ApplicationCommands(应用程序命令):
CancelPrint:取消打印
Close:关闭
ContextMenu:上下文菜单
Copy:复制
CorrectionList: Gets the value that represents the Correction List command.
Cut:剪切
Delete:删除
Find:查找
Help:帮助
New:新建
NotACommand:不是命令,被忽略
Open:打开
Paste:粘贴
Print:打印
PrintPreview:打印预览
Properties:属性
Redo:重做
Replace:取代
Save:保存
SaveAs:另存为
SelectAll:选择所有的
Stop:停止
Undo:撤消
ComponentCommands(组件命令):
ExtendSelection:后接Down/Left/Right/Up, 比如:ExtendSelectionDown(Shift+Down,Extend Selection Down),ExtendSelectionLeft等
Move:后接Down/Left/Right/Up, 如:MoveDown
MoveFocus:后接Down/Forward/Back/Up, 如:MoveFocusDown
MoveFocusPage:后接Down/Up,如:MoveFocusPageUp
MoveTo:后接End/Home/PageDown/PageUp,比如:MoveToPageDown
ScrollByLine
ScrollPage:后接Down/Left/Right/Up,比如:ScrollPageLeft
SelectTo:End/Home/PageDown/PageUp,比如:SelectToEnd
NavigationCommands(导航命令):
Browse浏览: 后接Back/Forward/Home/Stop, 比如:BrowseBack
缩放显示:DecreaseZoom, IncreaseZoom, Zoom
Favorites(收藏)
页面:FirstPage, LastPage, PreviousPage, NextPage,GoToPage
NavigateJournal
Refresh(刷新)
Search(搜索)
MediaCommands(多媒体控制命令):
Treble高音:DecreaseTreble,IncreaseTreble
Bass低音:BoostBass,DecreaseBass,IncreaseBass
Channel频道:ChannelDown,ChannelUp
MicrophoneVolume麦克风音量调节:DecreaseMicrophoneVolume,IncreaseMicrophoneVolume,MuteMicrophoneVolume
ToggleMicrophoneOnOff:麦克风开关
Volume音量: DecreaseVolume,IncreaseVolume,MuteVolume
Rewind, FastForward(回放,快进)
Track轨道:PreviousTrack,NextTrack [上一段(节)]
Play,Pause,Stop,Record(播放,暂停,停止,录制)
TogglePlayPause
Select选择
EditingCommands(编辑/排版类命令):
Align对齐:AlignCenter,AlignJustify,AlignLeft,AlignRight(居中,撑满,左对齐,右对齐)
Backspace退格
TabForward,TabBackward(Tab前缩,Tab向后)
FontSize字体大小:DecreaseFontSize,IncreaseFontSize
Indentation缩排:DecreaseIndentation, IncreaseIndentation
Delete删除: Delete选中部分,DeleteNextWord:删除后一字,DeletePreviousWord:删除前一字
EnterLineBreak:换行
EnterParagraphBreak:换段
CorrectSpellingError/IgnoreSpellingError:纠正/忽略拼写错误
MoveUpByLine,MoveDownByLine: 上/下移一行,
MoveUpByPage,MoveDownByPage: 上/下移一页
MoveUpByParagraph,MoveDownByParagraph: 上/下移一段
MoveLeftByCharacter/MoveRightByCharacter:左/右移一字符
MoveLeftByWord/MoveRightByWord 左/右移一词
MoveToDocumentStart/MoveToDocumentEnd:到文章开头/结尾
MoveToLineStart/MoveToLineEnd:到一行的开头/结尾
SelectUpByLine,SelectDownByLine:向上/下选一行
SelectUpByPage,SelectDownByPage:向上/下选一页
SelectUpByParagraph,SelectDownByParagraph:向上/下选一段
SelectLeftByCharacter,SelectRightByCharacter:向左/右选中一字
SelectLeftByWord,SelectRightByWord:向左/右选中一词
SelectToDocumentStart,SelectToDocumentEnd: 选中到篇头/篇尾
SelectToLineStart/SelectToLineEnd:选中到行首/行尾
ToggleBold, ToggleItalic, ToggleUnderline(加粗,斜体,下划线)
ToggleBullets, ToggleNumbering(列表:加点,加数字)
ToggleInsert:插入
ToggleSuperscript,ToggleSubscript(上标字,下标字)
先来举一个简单的例子:
XAML代码:
<StackPanel>
<Menu>
<MenuItem Command="ApplicationCommands.Paste" />
</Menu>
<TextBox />
</StackPanel>
C#代码:
StackPanel mainStackPanel = new StackPanel();
TextBox pasteTextBox = new TextBox();
Menu stackPanelMenu = new Menu();
MenuItem pasteMenuItem = new MenuItem();
stackPanelMenu.Items.Add(pasteMenuItem);
mainStackPanel.Children.Add(stackPanelMenu);
mainStackPanel.Children.Add(pasteTextBox);
pasteMenuItem.Command = ApplicationCommands.Paste;
上面代码演示了将对文本框设置为焦点时,菜单项可用,点击菜单项时,将执行粘贴命令。
下面列出关于Command的四个概念和四个小问题:
1、WPF中Command(命令)的四个概念:
(1)命令command:要执行的动作。
(2)命令源command source:发出命令的对象(继承自ICommandSource)。
(3)命令目标command target:执行命令的主体
(4)命令绑定command binding:映射命令逻辑的对象
比如在上面示例中,粘贴(Paste)就是命令(command), 菜单项(MenuItem)是命令源(command source), 文本框(TextBox)是命令目标对象(command target), 命令绑定到command binding文本框(TextBox)控件上。
提示:WPF中的命令都继承自ICommand接口。ICommand暴露两个方法:Execute方法、 CanExecute方法和一个事件:CanExecuteChanged。
继承自ICommandSource的有:ButtonBase, MenuItem, Hyperlink和InputBinding。
而Button,GridViewColumnHeader,ToggleButton,RepeatButton继承自ButtonBase。System.Windows.Input.KeyBinding和MouseBinding继承自InputBinding。
2、四个小问题:
(1)如何指定Command Sources?
XAML:(请将“ApplicationCommands.Properties”换成对应的ApplicationCommands属性值,比如:ApplicationCommands.Copy)
<StackPanel>
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Command="ApplicationCommands.Properties" />
</ContextMenu>
</StackPanel.ContextMenu>
</StackPanel>
同等的C#代码:
StackPanel cmdSourcePanel = new StackPanel();
ContextMenu cmdSourceContextMenu = new ContextMenu();
MenuItem cmdSourceMenuItem = new MenuItem();
cmdSourcePanel.ContextMenu = cmdSourceContextMenu;
cmdSourcePanel.ContextMenu.Items.Add(cmdSourceMenuItem);
cmdSourceMenuItem.Command = ApplicationCommands.Properties;
(2)如何指定快捷键?
XAML代码:
<Window.InputBindings>
<KeyBinding Key="B"
Modifiers="Control"
Command="ApplicationCommands.Open" />
</Window.InputBindings>
C#代码:
KeyGesture OpenKeyGesture = new KeyGesture(
Key.B,
ModifierKeys.Control);
KeyBinding OpenCmdKeybinding = new KeyBinding(ApplicationCommands.Open,OpenKeyGesture);
this.InputBindings.Add(OpenCmdKeybinding);
//也可以这样(下面一句与上面两句的效果等同):
//ApplicationCommands.Open.InputGestures.Add(OpenKeyGesture);
(3)如何Command Binding?
XAML代码:
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Open"
Executed="OpenCmdExecuted"
CanExecute="OpenCmdCanExecute"/>
</Window.CommandBindings>
C#代码:
CommandBinding OpenCmdBinding = new CommandBinding(
ApplicationCommands.Open,
OpenCmdExecuted,
OpenCmdCanExecute);
this.CommandBindings.Add(OpenCmdBinding);
具体的事件处理:
C#代码:
void OpenCmdExecuted(object target, ExecutedRoutedEventArgs e)
{
MessageBox.Show("The command has been invoked.");
}
void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
(4)如何设置Command Target并进行绑定Command Binding?
XAML代码:
<StackPanel>
<Menu>
<MenuItem Command="ApplicationCommands.Paste"
CommandTarget="{Binding ElementName=mainTextBox}" />
</Menu>
<TextBox Name="mainTextBox"/>
</StackPanel>
C#代码:
StackPanel mainStackPanel = new StackPanel();
TextBox mainTextBox= new TextBox();
Menu stackPanelMenu = new Menu();
MenuItem pasteMenuItem = new MenuItem();
stackPanelMenu.Items.Add(pasteMenuItem);
mainStackPanel.Children.Add(stackPanelMenu);
mainStackPanel.Children.Add(mainTextBox);
pasteMenuItem.Command = ApplicationCommands.Paste;
以上例子全是单条命令绑定的情形,事实上,你也可以多个按钮多条命令绑定到同一控件上,比如:
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Orientation="Horizontal" Height="25">
<Button Command="Cut" CommandTarget="{Binding ElementName=textBoxInput}" Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}"/>
<Button Command="Copy" CommandTarget="{Binding ElementName=textBoxInput}" Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}"/>
<Button Command="Paste" CommandTarget="{Binding ElementName=textBoxInput}" Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}"/>
<Button Command="Undo" CommandTarget="{Binding ElementName=textBoxInput}" Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}"/>
<Button Command="Redo" CommandTarget="{Binding ElementName=textBoxInput}" Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}"/>
<TextBox x:Name="textBoxInput" Width="200"/>
</StackPanel>
最后,贴出一个完整点的例子:
XAML代码:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WPFCommand.Window1"
Title="MenuItemCommandTask"
x:Name="Window"
Width="500"
Height="400"
>
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Open"
Executed="OpenCmdExecuted"
CanExecute="OpenCmdCanExecute"/>
<CommandBinding Command="Help" CanExecute="HelpCanExecute" Executed="HelpExecuted" />
</Window.CommandBindings>
<Window.InputBindings>
<KeyBinding Command="Help" Key="F2" />
<KeyBinding Command="NotACommand" Key="F1" />
</Window.InputBindings>
<Canvas>
<Menu DockPanel.Dock="Top">
<MenuItem Command="ApplicationCommands.Paste" Width="75" />
</Menu>
<TextBox BorderBrush="Black" BorderThickness="2" TextWrapping="Wrap" Text="这个TextBox未成为焦点之前,粘贴菜单不可用。" Width="476" Height="41" Canvas.Left="8" Canvas.Top="25"/>
<Button Command="ApplicationCommands.Open" Height="32" Width="223" Content="测试弹出对话框" Canvas.Left="8" Canvas.Top="70"/>
</Canvas>
</Window>
对应的C#代码:
using System;
using System.IO;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
namespace WPFCommand
{
public partial class Window1
{
public Window1()
{
this.InitializeComponent();
}
void OpenCmdExecuted(object target, ExecutedRoutedEventArgs e)
{
MessageBox.Show("测试弹出对话框,命令已执行!");
}
void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
void HelpCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
void HelpExecuted(object sender, ExecutedRoutedEventArgs e)
{
System.Diagnostics.Process.Start("http://www.BrawDraw.com/");
}
}
}
你不妨试试在程序执行之后,按下F1或F2试试效果,是不是按F2时浏览器指向"http://www.BrawDraw.com/",而按F1时没有任何效果?这是因为这两句:
<KeyBinding Command="Help" Key="F2" />
<KeyBinding Command="NotACommand" Key="F1" />
当按F2时,Help命令执行;当按F1时,由于Command="NotACommand",即窗口忽略此命令的执行。
执行效果图:
转载地址:http://blog.csdn.net/johnsuna/article/details/1770602
[转]WPF命令集 Command的更多相关文章
- WPF命令(Command)介绍、命令和数据绑定集成应用
要开始使用命令,必须做三件事: 一:定义一个命令 二:定义命令的实现 三:为命令创建一个触发器 WPF中命令系统的基础是一个相对简单的ICommand的接口,代码如下: public interfac ...
- WPF自学入门(十一)WPF MVVM模式Command命令
在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正如上一篇文章中在开始说的,MVVM的目的是为了最大限度地降低了 ...
- WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍
WPF自学入门(十一)WPF MVVM模式Command命令 在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式 ...
- 《Ansible权威指南》笔记(3)——Ad-Hoc命令集,常用模块
五.Ad-Hoc命令集1.Ad-Hoc命令集通过/usr/bin/ansible命令实现:ansible <host-pattern> [options] -v,--verbose ...
- shell编程:定义简单标准命令集
shell是用户操作接口的意思,操作系统运行起来后都会给用户提供一个操作界面,这个界面就叫shell,用户可以通过shell来调用操作系统内部的复杂实现,而shell编程就是在shell层次上进行编程 ...
- WPF快速入门系列(5)——深入解析WPF命令
一.引言 WPF命令相对来说是一个崭新的概念,因为命令对于之前的WinForm根本没有实现这个概念,但是这并不影响我们学习WPF命令,因为设计模式中有命令模式,关于命令模式可以参考我设计模式的博文:h ...
- 八,WPF 命令
WPF命令模型 ICommand接口 WPF命令模型的核心是System.Windows.Input.ICommand接口,该接口定义了命令的工作原理,它包含了两个方法和一个事件: public in ...
- WPF命令
WPF的命令是经常使用的,在MVVM中,RelayCommand更是用得非常多,但是命令的本质究竟是什么,有了事件为什么还要命令,命令与事件的区别是什么呢?MVVM里面是如何包装命令的呢?命令为什么能 ...
- linux---Vim命令集
Vim命令集 命令历史 以:和/开头的命令都有历史纪录,能够首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗体中输入下面命令就可以 vim 直接启动vim vim filena ...
随机推荐
- 阿里云 Aliplayer高级功能介绍(三):多字幕
基本介绍 国际化场景下面,播放器支持多字幕,可以有效解决视频的传播障碍难题,该功能适用于视频内容在全球范围内推广,阿里云的媒体处理服务提供接口可以生成多字幕,现在先看一下具体的效果: WebVTT格式 ...
- linxu(centos)安装nginx
安装make: yum -y install gcc automake autoconf libtool make 安装g++: yum install gcc gcc-c++ 下面正式开始 ---- ...
- Android Scroller简单用法 --View滚动
转:http://ipjmc.iteye.com/blog/1615828 Android里Scroller类是为了实现View平滑滚动的一个Helper类.通常在自定义的View时使用,在View中 ...
- 如何查看redis占用内存大小
redis缓存固然高效,可是它会占用我们系统中宝贵的内存资源,特别是当我们的项目运行了一段时间后,我们需要看一下redis占用了多少内存,那么可以用“info”命令查看. 执行info命令后,找到Me ...
- Ubunto 无法连接ssh客服端
解决办法: (1)查看ip地址是否冲突 我在单位的虚拟机ip地址是192.168.14.85,与其它机器冲突了.改成了192.168.14.83 (2)关闭Ubuntu14.04的防火墙 root ...
- transient在java中的作用
java 的transient关键字的作用是需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中. trans ...
- day 57 Django基础五之django模型层之关联管理器
Django基础五之django模型层之关联管理器 class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况 ...
- Django2.0+小程序技术打造微信小程序助手✍✍✍
Django2.0+小程序技术打造微信小程序助手 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题 ...
- 石子合并问题 /// 区间DP oj2025
Description 在一个圆形操场的四周摆放着n堆石子.现要将石子有次序地合并成一堆. 规定每次只能选相邻的两堆石子合并成新的一堆,并将新得的这堆石子数记为该次合并的得分. 试设计一个算法,计算出 ...
- hdu6088 组合数+反演+拆系数fft
题意:两个人van石头剪子布的游戏一共n盘,假设A赢了a盘,B赢了b盘,那么得分是gcd(a,b),求得分的期望*\(3^{2*n}\) 题解:根据题意很明显有\(ans=3^{n}*\sum_{a= ...