一起谈.NET技术,WPF 自定义快捷键命令(Command)

简介: 命令简介     WPF 中的命令是通过实现 ICommand 接口创建的。ICommand 公开两个方法(Execute 及 CanExecute)和一个事件(CanExecuteChanged)。

     命令简介

     WPF 中的命令是通过实现 ICommand 接口创建的。ICommand 公开两个方法(ExecuteCanExecute)和一个事件(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 提供了一组常用的路由命令,这组命令分布在几个类中:MediaCommandsApplicationCommandsNavigationCommandsComponentCommandsEditingCommands。这些类仅包含 RoutedCommand 对象,而不包含命令的实现逻辑。实现逻辑由其上执行命令的对象负责。[1]

     自定义命令

     除了上述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>

TextBlock

     首先在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+KeyGesture 两种方式为定义快捷键组合方式。大家可以任选其一进行使用,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 > 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”改变字体大小。

Increase

     除了在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 添加快捷键组合。

<KeyBinding Modifiers="Control+Alt" Key="C" Command="c:CustomCommand.ChangeFontColor"/>

     在中添加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(0,255),
(byte)rd.Next(0, 255),
(byte)rd.Next(0, 255))
);
}

Color

源代码下载

[1]引自:http://msdn.microsoft.com/zh-cn/library/ms752308.aspx

目录
相关文章
|
7月前
|
缓存 C# 虚拟化
WPF列表性能提高技术
WPF数据绑定系统不仅需要绑定功能,还需要能够处理大量数据而不会降低显示速度和消耗大量内存,WPF提供了相关的控件以提高性能,所有继承自`ItemsControl`的控件都支持该技术。
|
9月前
|
C# Windows
WPF技术之图形系列Polygon控件
WPF Polygon是Windows Presentation Foundation (WPF)框架中的一个标记元素,用于绘制多边形形状。它可以通过设置多个点的坐标来定义多边形的形状,可以绘制任意复杂度的多边形。
505 0
|
9月前
|
C# Windows
WPF技术之RichTextBox控件
WPF RichTextBox是Windows Presentation Foundation (WPF)中提供的一个强大的文本编辑控件,它可以显示富文本格式的文本,支持多种文本处理操作。
368 0
|
12天前
|
XML 数据可视化 C#
C# .NET面试系列五:WPF
<h2>WPF #### 1. WPF 由哪两部分组成? Windows Presentation Foundation (WPF) 由两个主要部分组成: 1、XAML (eXtensible Application Markup Language) ```c# 这是一种基于 XML 的标记语言,用于定义用户界面的结构和外观。XAML允许开发人员使用声明性语法来描述应用程序的用户界面元素,而不是使用传统的编程方式。XAML 被广泛用于定义 WPF 窗体、控件、布局和动画。 ``` 2、Code-behind 文件 ```c# 这是包含与用户界面相关逻辑的代码文件。通常,开发人员可
93 4
|
7月前
|
监控 安全 Linux
docker 命令 --cap-add NET_ADMIN 什么作用
`--cap-add NET_ADMIN` 是 Docker 容器运行时的一个参数,用于添加网络管理员权限(NET_ADMIN capability)给容器。 在 Linux 系统中,每个进程都有特定的权限来执行特定的操作。网络管理员权限是一种较高级的权限,它允许容器内的进程执行一些需要网络配置和管理的操作,例如配置网络接口、修改路由表、设置防火墙规则等。 通过添加 `--cap-add NET_ADMIN` 参数,Docker 容器将获得网络管理员权限,使其能够执行更高级的网络操作。这对于某些特定的应用场景,如网络监控、网络测试等非常有用。 需要注意的是,使用网络管理员权限可能存在安全
894 1
|
9月前
|
存储 自然语言处理 C#
WPF技术之Binding
WPF(Windows Presentation Foundation)是微软推出的一种用于创建应用程序用户界面的框架。Binding(绑定)是WPF中的一个重要概念,它用于在界面元素和数据源之间建立关联。通过Binding,可以将界面元素(如文本框、标签、列表等)与数据源(如对象、集合、属性等)进行绑定,从而实现数据的双向传递和同步更新。
150 2
WPF技术之Binding
|
9月前
|
数据挖掘 数据处理 C#
WPF技术之DataGrid控件
WPF DataGrid是一种可以显示和编辑数据的界面控件。它可以作为表格形式展示数据,支持添加、删除、修改、排序和分组操作。
200 0
|
12天前
|
人工智能 机器人 C#
Windows编程课设(C#)——基于WPF和.net的即时通讯系统(仿微信)
一款参考QQ、微信的即时通讯软件。采用CS结构,客户端基于.Net与WPF开发,服务端使用Java开发。
|
8月前
|
C#
WPF技术之动画系列-上下运动
本例子展现动画小球上下循环运动
136 0
|
9月前
|
前端开发 C# 容器
WPF技术之Command
WPF Command是一种在MVVM(Model-View-ViewModel)模式中用于处理用户界面交互的机制。它可以将用户界面事件(如按钮点击、菜单项选择等)与应用程序逻辑(命令处理)解耦,同时提供了一种便捷的方式来管理和执行命令
152 2