如何:将命令挂钩到不支持命令的控件
更新:2007 年 11 月
下面的示例演示如何将 RoutedCommand 挂钩到没有为该命令提供内置支持的 Control。 有关将多个命令挂钩到多个源的完整示例,请参见创建自定义 RoutedCommand 的示例示例。
示例
Windows Presentation Foundation (WPF) 提供了应用程序程序员经常遇到的常见命令库。 构成此命令库的类有: ApplicationCommands、ComponentCommands、NavigationCommands、MediaCommands 和 EditingCommands。
组成这些类的静态 RoutedCommand 对象不提供命令逻辑。 命令的逻辑通过 CommandBinding 与命令关联。 WPF 中的许多控件为命令库中的某些命令提供内置支持。 例如,TextBox 支持许多应用程序编辑命令,如 Paste、Copy、Cut、Redo 和 Undo。 应用程序开发人员不必执行任何特殊的操作即可使这些命令适用于这些控件。 如果 TextBox 是执行命令的命令目标,则此控件将使用其内置的 CommandBinding 来处理该命令。
下面演示如何将 Button 用作 Open 命令的命令源。 创建 CommandBinding,并使用 RoutedCommand 将它与指定的 CanExecuteRoutedEventHandler 和 CanExecuteRoutedEventHandler 关联。
首先创建命令源。 Button 用作命令源。
<Button Command="ApplicationCommands.Open" Name="MyButton"
Height="50" Width="200">
Open (KeyBindings: Ctrl+R, Ctrl+0)
</Button>
// Button used to invoke the command
Button CommandButton = new Button();
CommandButton.Command = ApplicationCommands.Open;
CommandButton.Content = "Open (KeyBindings: Ctrl-R, Ctrl-0)";
MainStackPanel.Children.Add(CommandButton);
接着,创建 ExecutedRoutedEventHandler 和 CanExecuteRoutedEventHandler。 ExecutedRoutedEventHandler 只是打开 MessageBox 以指出该命令已执行。 CanExecuteRoutedEventHandler 将 CanExecute 属性设置为 true。 通常,CanExecute 处理程序将执行更彻底的检查,以查看该命令是否可以在当前的命令目标上执行。
Private Sub OpenCmdExecuted(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs)
Dim command, targetobj As String
command = CType(e.Command, RoutedCommand).Name
targetobj = CType(sender, FrameworkElement).Name
MessageBox.Show("The " + command + " command has been invoked on target object " + targetobj)
End Sub
Private Sub OpenCmdCanExecute(ByVal sender As Object, ByVal e As CanExecuteRoutedEventArgs)
e.CanExecute = True
End Sub
void OpenCmdExecuted(object target, ExecutedRoutedEventArgs e)
{
String command, targetobj;
command = ((RoutedCommand)e.Command).Name;
targetobj = ((FrameworkElement)target).Name;
MessageBox.Show("The " + command + " command has been invoked on target object " + targetobj);
}
void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
最后,在应用程序的根 Window 上创建 CommandBinding,将路由事件处理程序与 Open 命令关联。
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Open"
Executed="OpenCmdExecuted"
CanExecute="OpenCmdCanExecute"/>
</Window.CommandBindings>
// Creating CommandBinding and attaching an Executed and CanExecute handler
CommandBinding OpenCmdBinding = new CommandBinding(
ApplicationCommands.Open,
OpenCmdExecuted,
OpenCmdCanExecute);
this.CommandBindings.Add(OpenCmdBinding);