在我们日常的应用程序操作中,经常要处理各种各样的命令和进行相关的事件处理,比如需要复制、粘贴文本框中的内容 ; 上网查看网页时,可能需要返回上一网页 查看相应内容 ; 而当我们播放视频和多媒体时,我们可能要调节音量,快速拖动到我们想看的片段等等。在 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 代码 :
同等C# 代码 :
上面代码演示了将对文本框设置为焦点时,菜单项可用,点击菜单项时,将执行粘贴命令。
下面列出关于 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 属性值,比如:
同等的 C# 代码:
( 2 )如何指定快捷键?
XAML 代码 :
同等C# 代码:
( 3 )如何 Command Binding ?
XAML 代码:
同等C# 代码:
具体的事件处理:
C# 代码:
( 4 )如何设置 Command Target 并进行绑定 Command Binding ?
XAML 代码:
同等C# 代码:
以上例子全是单条命令绑定的情形,事实上,你也可以多个按钮多条命令绑定到同一控件上,比如: