在上一章中,我们研究了使用WPF中已定义的命令的各种方法,当然您也可以实现自己的命令。它非常简单,一旦你完成它,就可以使用自己的命令,就像在WPF中定义的命令一样。
开始实现自己的命令的最简单方法是使用包含它们的静态类。然后将每个命令作为static字段添加到此类,允许您在应用程序中使用它们。由于WPF由于一些奇怪的原因,没有实现退出/离开命令,我决定为我们的自定义命令示例实现一个。它看起来像这样:
<Window x:Class="WpfTutorialSamples.Commands.CustomCommandSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:self="clr-namespace:WpfTutorialSamples.Commands"
Title="CustomCommandSample" Height="150" Width="200">
<Window.CommandBindings>
<CommandBinding Command="self:CustomCommands.Exit" CanExecute="ExitCommand_CanExecute" Executed="ExitCommand_Executed" />
</Window.CommandBindings>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Menu>
<MenuItem Header="File">
<MenuItem Command="self:CustomCommands.Exit" />
</MenuItem>
</Menu>
<StackPanel Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Command="self:CustomCommands.Exit">Exit</Button>
</StackPanel>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;
namespace WpfTutorialSamples.Commands
{
public partial class CustomCommandSample : Window
{
public CustomCommandSample()
{
InitializeComponent();
}
private void ExitCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
private void ExitCommand_Executed(object sender, ExecutedRoutedEventArgs e)
{
Application.Current.Shutdown();
}
}
public static class CustomCommands
{
public static readonly RoutedUICommand Exit = new RoutedUICommand
(
"Exit",
"Exit",
typeof(CustomCommands),
new InputGestureCollection()
{
new KeyGesture(Key.F4, ModifierKeys.Alt)
}
);
//Define more commands here, just like the one above
}
}
在标记中,我定义了一个带菜单和按钮的非常简单的界面,它们都使用我们新的自定义Exit命令。此命令在我们自己的CustomCommands类中的代码隐藏中定义,然后在窗口的CommandBindings集合中引用,我们在其中分配应该用于执行/检查是否允许执行的事件。
所有这些都与前一章中的示例类似,只是我们从我们自己的代码引用命令(使用顶部定义的“self”命名空间)而不是内置命令。
在Code-behind中,我们响应命令的两个事件:一个事件只允许命令一直执行,因为对于exit / quit命令通常是这样,而另一个事件调用Shutdown方法将终止我们的命令应用。一切都很简单。
如前所述,我们将Exit命令实现为静态CustomCommands类的字段。有几种方法可以在命令上定义和分配属性,但是我选择了更紧凑的方法(如果放在同一条线上会更紧凑,但为了便于阅读,我在这里添加了换行符)所有这一切都通过构造函数。参数是命令的文本/标签,命令的名称,所有者类型,然后是InputGestureCollection,允许我为命令定义默认快捷方式(Alt + F4)。
实现自定义WPF命令几乎与使用内置命令一样简单,它允许您在应用程序中为每个目的使用命令。这使得在多个地方重复使用操作变得非常容易,如本章示例所示。