WPF中的命令简述

来源:互联网 发布:管家婆导出数据 编辑:程序博客网 时间:2024/05/24 20:07

    在我们日常的应用程序操作中,经常要处理各种各样的命令和进行相关的事件处理,比如需要复制、粘贴文本框中的内容;上网查看网页时,可能需要返回上一网页 查看相应内容;而当我们播放视频和多媒体时,我们可能要调节音量,快速拖动到我们想看的片段等等。在Winform编程中,我们经常使用各种各样的控件来 解决此类问题,当然我们也必须编写一堆代码来处理各种各样的命令和事件处理。那么,Windows Presentation Foundation (WPF)作为微软新一代图形图像支援系统,它是如何处理这些命令及事件的呢?

   
WPF中,许多控件都自动集成了固有的命令集。比如文本框TextBox就提供了复制(Copy),粘贴(Paste),裁切(Cut),撤消(Undo)和重做(Redo)命令等。

   WPF
提供常用应用程序所用的命令集,常用的命令集包括:ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommandsEditingCommands

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, 比如:ExtendSelectionDownShift+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
WPFCommand(命令)的四个概念:
(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, HyperlinkInputBinding
Button GridViewColumnHeaderToggleButtonRepeatButton继承自ButtonBase System.Windows.Input.KeyBindingMouseBinding继承自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);

 

 

1

具体的事件处理:
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>

 

 

原创粉丝点击