文档库 最新最全的文档下载
当前位置:文档库 › WPF 自定义快捷键命令(Command)

WPF 自定义快捷键命令(Command)

WPF 自定义快捷键命令(Command)
WPF 自定义快捷键命令(Command)

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 对象,而不包含命令的实现逻辑。实现逻辑由其上执行命令的对象负 责。[1]
自定义命令

除了上述 WPF 自带的 RoutedCommand,还可以使用 RoutedUICommand 类创建用户自定义命 令,下面将通过一个实例详细讲解。首先新建一个 WPF 项目,在其中加入一个 TextBlock。目的是 通过快捷键组合“Ctrl+Alt+I”和“Ctrl+Alt+D”改变字体大小,由“Ctrl+Alt+C”随机改变字体颜色。


首先在 Window.Resources 中定义两个 RoutedUICommand,分别用于增加和减小字体尺寸。



通过 KeyBinding 为上面两个命令绑定快捷键,按键组合可使用“+”进行连接。下面代码分别通过 Modifiers+Key 和 Gesture 两种方式为定义快捷键组合方式。大家可以任选其一进行使用,MSDN 中 建议使用 Gesture 方式定义以免发生混淆。

接下来就要通过 CanExecute 和 Excuted 为命令绑定相关的事件,CanExecute 负责判断能否执 行命令(即 Executed 定义的事件),Executed 就负责去执行用户定义的操作命令。


至此,我们在 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 > 50) { e.CanExecute = false; } else { e.CanExecute = true; } }
private void CommandBinding_Increase_Executed(object sender, ExecutedRoutedEventArgs e) { textBlock1.FontSize += 5;

}
private void CommandBinding_Decrease_CanExecute(object sender, CanExecuteRoutedEventArgs e) { if (textBlock1.FontSize <= 5) { e.CanExecute = false; } else { e.CanExecute = true; } }
private void CommandBinding_Decrease_Executed(object sender, ExecutedRoutedEventArgs e) { textBlock1.FontSize -= 5; }
运行程序使用“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 中加入命名空间,以便后面调用 ChangeFontColor 命令。
xmlns:c="clr-namespace:WpfUserControlTest"
中为 ChangeFontColor 添加快捷键组合。

中添加 CanExecute、Excuted 命令事件。

当用户点击“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(0,255), (byte)rd.Next(0, 255), (byte)rd.Next(0, 255)) ); }


wpf自定义slider控件

自定义Slider控件 最终效果: 界面: