在WPF中,命令是一个独立的操作,把这个操作分离出来的作用是增强程序的灵活性。命令适合那些不依赖某固定对象的操作,不管理是调用操作还是执行操作的对象。
如下图,复制命令是个相对独立的操作,不管是按钮,菜单还是快捷来调用这个命令都是可以的,复制命令执行时需要有选中的内容,也就是执行的对象。图中的文本或列表都是执行的对象,这时,复制操作定义成命令是一个很好的选择,因为这样把复制操作与调用方与执行对象进行了分离。
代码如下:
<Grid MouseDown="Grid_MouseDown">
<StackPanel>
<Button Content="复制" Command="ApplicationCommands.Copy" CommandTarget="{Binding ElementName=tb1}"></Button>
<TextBox Name="tb1" ;97" Text="234" Height="73" />
</StackPanel>
</Grid>
调用操作的对象是Button,执行操作的对象是TextBox,复制是操作。
在WPF中命令有四部分组成:命令,命令源,命令目标,命令绑定
在上例中,ApplicationCommands.Copy操作是命令,Button是命令源,也即调用操作的对象,TextBox是命令目标,命令绑定由TextBox提供。
一、命令
命令可以分为系统预定义命令,和自定义命令。
系统预定义命令有:
1. MediaCommands
名称 |
说明 |
BoostBass |
获取表示“增强低音”命令的值。 |
ChannelDown |
获取表示“频道递减”命令的值。 |
ChannelUp |
获取表示“频道递增”命令的值。 |
DecreaseBass |
获取表示“降低低音”命令的值。 |
DecreaseMicrophoneVolume |
获取表示“降低麦克风音量”命令的值。 |
DecreaseTreble |
获取表示“降低高音”命令的值。 |
DecreaseVolume |
获取表示“降低音量”命令的值。 |
FastForward |
获取表示“快进”命令的值。 |
IncreaseBass |
获取表示“提高低音”命令的值。 |
IncreaseMicrophoneVolume |
获取表示“提高麦克风音量”命令的值。 |
IncreaseTreble |
获取表示“提高高音”命令的值。 |
IncreaseVolume |
获取表示“提高音量”命令的值。 |
MuteMicrophoneVolume |
获取表示“将麦克风静音”命令的值。 |
MuteVolume |
获取表示“静音”命令的值。 |
NextTrack |
获取表示“下一曲目”命令的值。 |
Pause |
获取表示“暂停”命令的值。 |
Play |
获取表示“播放”命令的值。 |
PreviousTrack |
获取表示“上一曲目”命令的值。 |
Record |
获取表示“录制”命令的值。 |
Rewind |
获取表示“后退”命令的值。 |
Select |
获取表示“选择”命令的值。 |
Stop |
获取表示“停止”命令的值。 |
ToggleMicrophoneOnOff |
获取表示“打开/关闭麦克风”命令的值。 |
TogglePlayPause |
获取表示“切换播放暂停”命令的值。 |
2. ApplicationCommands
名称 |
说明 |
CancelPrint |
获取表示“取消打印”命令的值。 |
Close |
获取表示“关闭”命令的值。 |
ContextMenu |
获取表示“上下文菜单”命令的值。 |
Copy |
获取表示“复制”命令的值。 |
CorrectionList |
获取表示“集合列表”命令的值。 |
Cut |
获取表示“剪切”命令的值。 |
Delete |
获取表示“删除”命令的值。 |
Find |
获取表示“查找”命令的值。 |
Help |
获取表示“帮助”命令的值。 |
New |
获取表示“新建”命令的值。 |
NotACommand |
表示始终被忽略的命令。 |
Open |
获取表示“打开”命令的值。 |
Paste |
获取表示“粘贴”命令的值。 |
|
获取表示“打印”命令的值。 |
PrintPreview |
获取表示“打印预览”命令的值。 |
Properties |
获取表示“属性”命令的值。 |
Redo |
获取表示“重复”命令的值。 |
Replace |
获取表示“替换”命令的值。 |
Save |
获取表示“保存”命令的值。 |
SaveAs |
获取表示“另存为”命令的值。 |
SelectAll |
获取表示“全选”命令的值。 |
Stop |
获取表示“停止”命令的值。 |
Undo |
获取表示“撤消”命令的值。 |
3. NavigationCommands
名称 |
说明 |
BrowseBack |
获取表示 Browse Back 命令的值。 |
BrowseForward |
获取表示 Browse Forward 命令的值。 |
BrowseHome |
获取表示 Browse Home 命令的值。 |
BrowseStop |
获取表示 Browse Stop 命令的值。 |
DecreaseZoom |
获取表示 Decrease Zoom 命令的值。 |
Favorites |
获取表示 Favorites 命令的值。 |
FirstPage |
获取表示 First Page 命令的值。 |
GoToPage |
获取表示 Go To Page 命令的值。 |
IncreaseZoom |
获取表示 Increase Zoom 命令的值。 |
LastPage |
获取表示 Last Page 命令的值。 |
NavigateJournal |
获取表示 Navigate Journal 命令的值。 |
NextPage |
获取表示 Next Page 命令的值。 |
PreviousPage |
获取表示 Previous Page 命令的值。 |
Refresh |
获取表示 Refresh 命令的值。 |
Search |
获取表示 Search 命令的值。 |
Zoom |
获取表示 Zoom 命令的值。 |
4. ComponentCommands
名称 |
说明 |
ExtendSelectionDown |
获取表示“向下扩展选择”命令的值。 |
ExtendSelectionLeft |
获取表示“向左扩展选择”命令的值。 |
ExtendSelectionRight |
获取表示“向右扩展选择”命令的值 |
ExtendSelectionUp |
获取表示“向上扩展选择”命令的值。 |
MoveDown |
获取表示“下移”命令的值。 |
MoveFocusBack |
获取表示“向后移动焦点”命令的值。 |
MoveFocusDown |
获取表示“向下移动焦点”命令的值。 |
MoveFocusForward |
获取表示“向前移动焦点”命令的值。 |
MoveFocusPageDown |
获取表示“将焦点下移一页”命令的值。 |
MoveFocusPageUp |
获取表示“将焦点上移一页”命令的值。 |
MoveFocusUp |
获取表示“向上移动焦点”命令的值。 |
MoveLeft |
获取表示“左移”命令的值。 |
MoveRight |
获取表示“右移”命令的值。 |
MoveToEnd |
获取表示“移至结尾”命令的值。 |
MoveToHome |
获取表示“移至开头”命令的值。 |
MoveToPageDown |
获取表示“移到下一页”命令的值。 |
MoveToPageUp |
获取表示“移到上一页”命令的值。 |
MoveUp |
获取表示“上移”命令的值。 |
ScrollByLine |
获取表示“按行滚动”命令的值。 |
ScrollPageDown |
获取表示“向下滚动一页”的值。 |
ScrollPageLeft |
获取表示“向左滚动一页”命令的值。 |
ScrollPageRight |
获取表示“向右滚动一页”命令的值。 |
ScrollPageUp |
获取表示“向上滚动一页”的值。 |
SelectToEnd |
获取表示“选择到末尾”命令的值。 |
SelectToHome |
获取表示“选择到开头”命令的值。 |
SelectToPageDown |
获取表示“向下选择一页”命令的值。 |
SelectToPageUp |
获取表示“向上选择一页”命令的值。 |
5. EditingCommands
名称 |
默认键笔势 |
说明 |
AlignCenter |
Ctrl+ E |
表示 AlignCenter 命令,该命令请求将当前段落或选中的段落居中。 |
AlignJustify |
Ctrl+ J |
表示 AlignJustify 命令,该命令请求将当前段落或选中的段落两端对齐。 |
AlignLeft |
Ctrl+ L |
表示 AlignLeft 命令,该命令请求将所选内容左对齐。 |
AlignRight |
Ctrl+ R |
表示 AlignRight 命令,该命令请求将所选内容右对齐。 |
Backspace |
Backspace |
表示 Backspace 命令,该命令请求在当前位置或当前所选内容上输入一个退格。 |
CorrectSpellingError |
无默认键笔势 |
表示 CorrectSpellingError 命令,该命令请求更正当前位置任何拼写错误的单词。 |
DecreaseFontSize |
Ctrl+ OemOpenBrackets |
表示 DecreaseFontSize 命令,该命令请求将当前所选内容的字号缩小 1 磅。 |
DecreaseIndentation |
Ctrl+ Shift+ T |
表示 DecreaseIndentation 命令,该命令请求将当前段落的缩进减少一个制表位。 |
Delete |
Delete |
表示 Delete 命令,该命令请求删除当前所选内容。 |
DeleteNextWord |
Ctrl+ Delete |
表示 DeleteNextWord 命令,该命令请求删除下一单词(相对于当前位置而言)。 |
DeletePreviousWord |
Ctrl+ Backspace |
表示 DeletePreviousWord 命令,该命令请求删除上一单词(相对于当前位置而言)。 |
EnterLineBreak |
Shift+ Enter |
表示 EnterLineBreak 命令,该命令请求在当前位置或当前所选内容上插入一个换行符。 |
EnterParagraphBreak |
Enter |
表示 EnterParagraphBreak 命令,该命令请求在当前位置或当前所选内容上插入一个分段符。 |
IgnoreSpellingError |
无默认键笔势 |
表示 IgnoreSpellingError 命令,该命令请求忽略当前位置或当前所选内容中任何拼写错误的单词的实例。 |
IncreaseFontSize |
Ctrl+ OemCloseBrackets |
表示 IncreaseFontSize 命令,该命令请求将当前所选内容的字号增加 1 磅。 |
IncreaseIndentation |
Ctrl+ T |
表示 IncreaseIndentation 命令,该命令请求将当前段落的缩进增加一个制表位。 |
MoveDownByLine |
Down |
表示 MoveDownByLine 命令,该命令请求将插入符号向下移动一行。 |
MoveDownByPage |
PageDown |
表示 MoveDownByPage 命令,该命令请求将插入符号向下移动一页。 |
MoveDownByParagraph |
Ctrl+ Down |
表示 MoveDownByParagraph 命令,该命令请求将插入符号向下移动一个段落。 |
MoveLeftByCharacter |
Left |
表示 MoveLeftByCharacter 命令,该命令请求将插入符号向左移动一个字符。 |
MoveLeftByWord |
Ctrl+ Left |
表示 MoveLeftByWord 命令,该命令请求将插入符号向左移动一个单词。 |
MoveRightByCharacter |
Right |
表示 MoveRightByCharacter 命令,该命令请求将插入符号向右移动一个字符。 |
MoveRightByWord |
Ctrl+ Right |
表示 MoveRightByWord 命令,该命令请求将插入符号向右移动一个单词。 |
MoveToDocumentEnd |
Ctrl+ End |
表示 MoveToDocumentEnd 命令,该命令请求将插入符号移至内容的末尾。 |
MoveToDocumentStart |
Ctrl+ Home |
表示 MoveToDocumentStart 命令,该命令请求将插入符号移至内容的开头。 |
MoveToLineEnd |
End |
表示 MoveToLineEnd 命令,该命令请求将插入符号移至当前行的末尾。 |
MoveToLineStart |
Home |
表示 MoveToLineStart 命令,该命令请求将插入符号移至当前行的开头。 |
MoveUpByLine |
Up |
表示 MoveUpByLine 命令,该命令请求将插入符号向上移动一行。 |
MoveUpByPage |
PageUp |
表示 MoveUpByPage 命令,该命令请求将插入符号向上移动一页。 |
MoveUpByParagraph |
Ctrl+ Up |
表示 MoveUpByParagraph 命令,该命令请求将插入符号向上移动一个段落。 |
SelectDownByLine |
Shift+ Down |
表示 SelectDownByLine 命令,该命令请求将当前选择范围向下扩展一行。 |
SelectDownByPage |
Shift+ PageDown |
表示 SelectDownByPage 命令,该命令请求将当前选择范围向下扩展一页。 |
SelectDownByParagraph |
Ctrl+ Shift+ Down |
表示 SelectDownByParagraph 命令,该命令请求将当前选择范围向下扩展一段。 |
SelectLeftByCharacter |
Shift+ Left |
表示 SelectLeftByCharacter 命令,该命令请求将当前选择范围向左扩展一个字符。 |
SelectLeftByWord |
Ctrl+ Shift+ Left |
表示 SelectLeftByWord 命令,该命令请求将当前选择范围向左扩展一个单词。 |
SelectRightByCharacter |
Shift+ Right |
表示 SelectRightByCharacter 命令,该命令请求将当前选择范围向右扩展一个字符。 |
SelectRightByWord |
Ctrl+ Shift+ Right |
表示 SelectRightByWord 命令,该命令请求将当前选择范围向右扩展一个单词。 |
SelectToDocumentEnd |
Ctrl+ Shift+ End |
表示 SelectToDocumentEnd 命令,该命令请求将当前选择范围扩展到内容末尾处。 |
SelectToDocumentStart |
Ctrl+ Shift+ Home |
表示 SelectToDocumentStart 命令,该命令请求将当前选择范围扩展到内容开头处。 |
SelectToLineEnd |
Shift+ End |
表示 SelectToLineEnd 命令,该命令请求将当前选择范围扩展到当前行的末尾。 |
SelectToLineStart |
Shift+ Home |
表示 SelectToLineStart 命令,该命令请求将当前选择范围扩展到当前行的开头。 |
SelectUpByLine |
Shift+ Up |
表示 SelectUpByLine 命令,该命令请求将当前选择范围向上扩展一行。 |
SelectUpByPage |
Shift+ PageUp |
表示 SelectUpByPage 命令,该命令请求将当前选择范围向上扩展一页。 |
SelectUpByParagraph |
Ctrl+ Shift+ Up |
表示 SelectUpByParagraph 命令,该命令请求将当前选择范围向上扩展一段。 |
TabBackward |
Shift+ Tab |
表示 TabBackward 命令。 |
TabForward |
Tab |
表示 TabForward 命令。 |
ToggleBold |
Ctrl+ B |
表示 ToggleBold 命令,该命令请求对当前所选内容进行 Bold 格式切换。 |
ToggleBullets |
Ctrl+ Shift+ L |
表示 ToggleBullets 命令,该命令请求对当前所选内容进行无序列表(也称为项目符号列表)格式切换。 |
ToggleInsert |
Insert |
表示 ToggleInsert 命令,该命令用于切换“插入”和“改写”键入模式。 |
ToggleItalic |
Ctrl+ I |
表示 ToggleItalic 命令,该命令请求对当前所选内容进行 Italic 格式切换。 |
ToggleNumbering |
Ctrl+ Shift+ N |
表示 ToggleNumbering 命令,该命令请求对当前所选内容进行排序列表(也称为编号列表)格式切换。 |
ToggleSubscript |
Ctrl+ OemPlus |
表示 ToggleSubscript 命令,该命令请求对当前所选内容进行下标格式切换。 |
ToggleSuperscript |
Ctrl+ Shift+OemPlus |
表示 ToggleSuperscript 命令,该命令请求对当前所选内容进行上标格式切换。 |
ToggleUnderline |
Ctrl+ U |
表示 ToggleUnderline 命令,该命令请求对当前所选内容进行 Underline 格式切换。 |
命令也可以自定义,可以实接口ICommand,也可以创建自定义类,类中存放RoutedCommand或RoutedUICommand静态字段或属性。
我们使用后都来构造自定义命令:
首先定义一个类:在这个类中用一个ICommand的子类,RoutedUICommand继承自RoutedCommand,RoutedCommand继承自ICommand。并且RoutedUICommand定义的字段是静态的。
class MyCommand
{
public static RoutedUICommand MyRCom;
static MyCommand()
{
InputGestureCollection inputs = new InputGestureCollection();
inputs.Add(new KeyGesture(Key.A, ModifierKeys.Control));
inputs.Add(new MouseGesture(MouseAction.LeftDoubleClick, ModifierKeys.Control));//添加的两种输入操作
MyRCom = new RoutedUICommand("自定义命令", "MyRCom", typeof(MyCommand), inputs);
}
}
其实在XAML层给数据源设置命令:
<Window x:Class="WpfApplication1.MainWindow"
xmlns:w="clr-namespace:WpfApplication1;assembly=WpfApplication1"
>
<Grid>
<StackPanel>
<Button Command="w:MyCommand.MyRCom" Content="按钮"/>
</StackPanel>
</Grid>
</Window>
接下进行命令绑定,在窗体的构造函数里加入
public MainWindow()
{
InitializeComponent();
CommandBinding cmdbing = new CommandBinding(MyCommand.MyRCom);
cb.Executed += TestMethod;
this.CommandBindings.Add(cmdbing);
}
void TestMethod (object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show(“执行结果”);
}