【转】【WPF】WPF 自定义快捷键命令(Command)
命令简介
WPF 中的命令是通过实现 ICommand 接口创建的。ICommand 公开两个方法(Execute 及 CanExecute)和一个事件(CanExecuteChanged)。Execute 执行与命令关联的操作。CanExecute 确定是否可以在当前命令目标上执行命令。如果集中管理命令操作的命令管理器检测到命令源中发生了更改,此更改可能使得已引发但尚未由命令绑定执行的命令无效,则将引发 CanExecuteChanged。ICommand 的 WPF 实现是 RoutedCommand 类。
WPF 中的主要输入源是鼠标、键盘、墨迹和路由命令。更加面向设备的输入使用 RoutedEvent 来通知应用程序页中的对象已发生了输入事件。RoutedCommand 没有不同。RoutedCommand 的 Execute 和 CanExecute 方法不包含命令的应用程序逻辑,而是引发这样的路由事件:沿元素树以隧道和冒泡形式传递,直到遇到具有 CommandBinding 的对象。CommandBinding 包含这些事件的处理程序,执行此命令的就是这些处理程序。
RoutedCommand 上的 Execute 方法在命令目标上引发 PreviewExecuted 和 Executed 事件。RoutedCommand 上的 CanExecute 方法在命令目标上引发 CanExecute 和 PreviewCanExecute 事件。这些事件沿元素树以隧道和冒泡形式传递,直到遇到具有该特定命令的 CommandBinding 的对象。
WPF 提供了一组常用的路由命令,这组命令分布在几个类中:MediaCommands、ApplicationCommands、NavigationCommands、ComponentCommands 和 EditingCommands。这些类仅包含 RoutedCommand 对象,而不包含命令的实现逻辑。实现逻辑由其上执行命令的对象负责。
自定义命令
除了上述WPF 自带的RoutedCommand,还可以使用RoutedUICommand 类创建用户自定义命令,下面将通过一个实例详细讲解。首先新建一个WPF 项目,在其中加入一个TextBlock。目的是通过快捷键组合“Ctrl+Alt+I”和“Ctrl+Alt+D”改变字体大小,由“Ctrl+Alt+C”随机改变字体颜色。
<Grid>
<TextBlock x:Name="textBlock1" Text="Hello World" HorizontalAlignment="Center"
FontSize="10" Margin="42,29,46,41" Width="293" /> </Grid>

首先在Window.Resources 中定义两个RoutedUICommand,分别用于增加和减小字体尺寸。
<Window.Resources>
<RoutedUICommand x:Key="IncreaseFontSize" Text="Increase Font Size" />
<RoutedUICommand x:Key="DecreaseFontSize" Text="Decrease Font Size" />
</Window.Resources>
通过KeyBinding 为上面两个命令绑定快捷键,按键组合可使用“+”进行连接。下面代码分别通过Modifiers+Key 和Gesture 两种方式为定义快捷键组合方式。大家可以任选其一进行使用,MSDN 中建议使用Gesture 方式定义以免发生混淆。
<Window.InputBindings>
<KeyBinding Modifiers="Ctrl+Alt" Key="I" Command="{StaticResource IncreaseFontSize}"/>
<KeyBinding Gesture="Ctrl+Alt+D" Command="{StaticResource DecreaseFontSize}"/>
</Window.InputBindings>
接下来就要通过CanExecute和Excuted 为命令绑定相关的事件,CanExecute 负责判断能否执行命令(即Executed 定义的事件),Executed 就负责去执行用户定义的操作命令。
<Window.CommandBindings>
<CommandBinding Command="{StaticResource IncreaseFontSize}"
CanExecute="CommandBinding_Increase_CanExecute"
Executed="CommandBinding_Increase_Executed"/>
<CommandBinding Command="{StaticResource DecreaseFontSize}"
CanExecute="CommandBinding_Decrease_CanExecute"
Executed="CommandBinding_Decrease_Executed"/>
</Window.CommandBindings>
至此,我们在XAML 中对命令的定义已经完成。下面进入到C# 中编写命令事件相关内容。扩大字体尺寸时通过CommandBinding_Increase_CanExecute 判断当前字体是否小于50,否则不会执行Executed 命令。若字体尺寸在50以内则通过CommandBinding_Increase_Executed 每次增加5。缩小尺寸时则不低于5。
private void CommandBinding_Increase_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
if (textBlock1.FontSize > )
{
e.CanExecute = false;
}
else
{
e.CanExecute = true;
}
} private void CommandBinding_Increase_Executed(object sender, ExecutedRoutedEventArgs e)
{
textBlock1.FontSize += ;
} private void CommandBinding_Decrease_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
if (textBlock1.FontSize <= )
{
e.CanExecute = false;
}
else
{
e.CanExecute = true;
}
} private void CommandBinding_Decrease_Executed(object sender, ExecutedRoutedEventArgs e)
{
textBlock1.FontSize -= ;
}
运行程序使用“Ctrl+Alt+I”或 “Ctrl+Alt+D”改变字体大小。

除了在XAML 中定义RoutedUICommand 我们也可以直接用C#定义,下面继续完成修改字体颜色的快捷键命令。新建一个CustomCommand 类,在其中加入如下代码定义ChangeFontColor 命令。
using System.Windows.Input; namespace WpfUserControlTest
{
class CustomCommand
{
public static readonly RoutedUICommand ChangeFontColor =
new RoutedUICommand("Change Font Color", "ChangeFontColor", typeof(MainWindow));
}
}
在MainWindow.xaml <Window> 中加入命名空间,以便后面调用ChangeFontColor 命令。
xmlns:c="clr-namespace:WpfUserControlTest"
在<Window.InputBindings>中为ChangeFontColor 添加快捷键组合。
<KeyBinding Modifiers="Control+Alt" Key="C" Command="c:CustomCommand.ChangeFontColor"/>
在<Window.CommandBindings>中添加CanExecute、Excuted 命令事件。
<CommandBinding Command="c:CustomCommand.ChangeFontColor"
CanExecute="CommandBinding_Color_CanExecute"
Executed="CommandBinding_Color_Executed"/>
当用户点击“Ctrl+Alt+C”是触发命令事件,最近改变字体颜色。
private void CommandBinding_Color_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
} private void CommandBinding_Color_Executed(object sender, ExecutedRoutedEventArgs e)
{
Random rd = new Random();
textBlock1.Foreground = new SolidColorBrush(
Color.FromRgb(
(byte)rd.Next(,),
(byte)rd.Next(, ),
(byte)rd.Next(, ))
);
}

原文地址:http://www.cnblogs.com/gnielee/archive/2010/07/16/wpf-custom-hotkey-command.html
【转】【WPF】WPF 自定义快捷键命令(Command)的更多相关文章
- WPF 自定义快捷键命令(COMMAND)(转)
命令简介 WPF 中的命令是通过实现 ICommand 接口创建的.ICommand 公开两个方法(Execute 及 CanExecute)和一个事件(CanExecuteChanged).Exec ...
- WPF之自定义委托命令
常用命令 WPF的命令实际上就是实现了ICommand接口的类,平时使用最多的是RoutedCommand类,还可以使用自定义命令. RoutedCommand只负责跑腿,并不对命名目标做任何操作,实 ...
- WPF之全局快捷键
目录 1.WPF快捷键实现方式 2.全局快捷键设置界面 3.Windows API调用 4.注册全局快捷键 5.快捷键触发 WPF快捷键实现方式 WPF快捷键实现主要有自定义快捷键命令和全局快捷键两种 ...
- WPF之事件绑定命令
目录 事件绑定意义 无参数的事件绑定 带EventArgs参数的事件绑定 使用事件绑定 扩展:基于InvokeCommandAction源码的实现(推荐) 参考资料 事件绑定意义 一般事件的处理程序都 ...
- WPF中的命令(Command)
这节来讲一下WPF中的命令(Command)的使用. [认识Command] 我们之前说过,WPF本身就为我们提供了一个基础的MVVM框架,本节要讲的命令就是其中一环,通过在ViewModel中声明命 ...
- 示例:WPF中自定义MessageService应用DialogHost、Snackbar、NotifyIcon显示各种场景提示消息
原文:示例:WPF中自定义MessageService应用DialogHost.Snackbar.NotifyIcon显示各种场景提示消息 一.目的:不同交互场景需要提示不同的消息,不同的消息需要用不 ...
- 示例:WPF中自定义StoryBoarService在代码中封装StoryBoard、Animation用于简化动画编写
原文:示例:WPF中自定义StoryBoarService在代码中封装StoryBoard.Animation用于简化动画编写 一.目的:通过对StoryBoard和Animation的封装来简化动画 ...
- WPF 之 自定义窗体标题栏
在WPF中自定义窗体标题栏,首先需要将窗体的WindowStyle属性设置为None,隐藏掉WPF窗体的自带标题栏.然后可以在窗体内部自定义一个标题栏. 例如,标题栏如下: <WrapPanel ...
- 在WPF中自定义你的绘制(五)
原文:在WPF中自定义你的绘制(五) 在WPF中自定义你的绘制(五) ...
随机推荐
- Block的使用及循环引用的解决
Block是一个很好用的东西,这篇文章主要来介绍:1.什么是Block?2.Block的使用?3.Block的循环引用问题及解决. 1.什么是Block? 说这个问题之前,我先来说一下闭包(Closu ...
- 那些Xcode不能错过的插件
转载来自网络 古人云“工欲善其事必先利其器”,打造一个强大的开发环境,是立即提升自身战斗力的绝佳途径!以下是搜集的一些有力的XCode插件. 1.全能搜索家CodePilot 2.0 你要找的 ...
- Monyer's Game 11~15关过关方法
到目前为止,玩这个小游戏并过关的人数已经达到了81人,首先Monyer要感谢各位的捧场与支持.继续上次的<Monyer's Game 6~10关过关方法>,我们来看剩下几关的过关方法. 但 ...
- andorid开发eclipse常见问题
1.报错: BUILD FAILED D:\workspace\ganji\build.xml:144: The following error occurred while executing th ...
- windows分离系统文件和用户数据
2013/12/17更新:使用了一段时间,开机时有时会出现一些错误,不过不影响正常使用,不能忍的是会经常更新,所以暂时不推荐使用. 为了方便地重装系统,同时保留用户数据,想到了分离windows系统文 ...
- Linux之格式化与挂载
格式化与挂载 一块硬盘要想被使用,要经过分区,格式化,挂载这三个步骤.前面我们讲过MBR分区和GPT分区. 下面我们就来讲一下如果格式化一个分区.其实很简单,一句话就能搞定了. 首先来查看一下sdb盘 ...
- JavaScript Patterns 2.10 Naming Conventions
1. Capitalizing Constructors var adam = new Person(); 2. Separating Words camel case - type the word ...
- ECharts 之一——入门
一.简介 ECharts是一个来自百度的开源的javascript图标库.通过ECharts我们可以呈现出多种类型的图表.ECharts底层基于ZRender(一个全新的轻量级canvas类库),创建 ...
- Swing应用开发实战系列之三:动态信息提示窗口
这里所说的“动态信息提示窗口”可不同于JOptionPane中的Message窗口和Confirm窗口,它们都是静态的模态的,更重要的是线程阻塞的,迫使你必须选择某个动作才能继续执行.我们接下来要分享 ...
- Ajax详解及其案例分析------如何获得Ajax对象,使用Ajax对象发送GET和POST请求,校验用户名,POST和GET请求时的乱码处理,实现级联的下拉列表
本节主要内容预览: 1 获得Ajax对象 2 使用Ajax对象发送GET请求 3 使用Ajax对象发送POST请求 4 使用Ajax校验用户名 5 POST请求时的乱码处理 6 GET请求时的乱码处理 ...