如何:将命令挂钩到支持命令的控件

更新:2007 年 11 月

下面的示例演示如何将 RoutedCommand 挂钩到为该命令提供了内置支持的 Control。 有关将多个命令挂钩到多个源的完整示例,请参见创建自定义 RoutedCommand 的示例示例。

示例

Windows Presentation Foundation (WPF) 提供了应用程序程序员经常遇到的常见命令库。 构成此命令库的类有: ApplicationCommandsComponentCommandsNavigationCommandsMediaCommandsEditingCommands

组成这些类的静态的 RoutedCommand 对象不提供命令逻辑。 命令的逻辑与具有 CommandBinding 的命令关联。 有一些控件内置了针对某些命令的 CommandBinding。 这种机制允许命令的语义保留不变,而实际的实现可以改变。 例如,TextBox 处理 Paste 命令的方式不同于可支持图像的控件对它的处理方式,但是其粘贴操作的本意仍然保留不变。 命令逻辑不能由命令提供,而必须由控件或应用程序提供。

WPF 中的许多控件确实为命令库中的某些命令提供了内置支持。 例如,TextBox 支持许多应用程序编辑命令,包括 PasteCopyCutRedoUndo。 应用程序开发人员不必执行任何特殊的操作即可将这些命令与这些控件一起使用。 如果 TextBox 是执行命令的命令目标,则此控件将使用其内置的 CommandBinding 来处理该命令。

下面的示例演示如何将 MenuItem 用作 Paste 命令的命令源,其中 TextBox 是该命令的目标。 用于定义 TextBox 执行粘贴的方式的所有逻辑都内置到 TextBox 控件中。

创建一个 MenuItem 并将其 Command 属性设置为 Paste 命令。 没有将 CommandTarget 显式设置为 TextBox 对象。 没有设置 CommandTarget 时,命令的目标为具有键盘焦点的元素。 如果具有键盘焦点的元素不支持 Paste 命令或者目前无法执行粘贴命令(例如剪贴板为空),则 MenuItem 将变灰。

<Window x:Class="SDKSamples.Window1"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    Title="MenuItemCommandTask"
    >
    <DockPanel>
      <Menu DockPanel.Dock="Top">
        <MenuItem Command="ApplicationCommands.Paste" Width="75" />
      </Menu>
      <TextBox BorderBrush="Black" BorderThickness="2" Margin="25"
               TextWrapping="Wrap">
        The MenuItem will not be enabled until
        this TextBox gets keyboard focus  
      </TextBox>
    </DockPanel>
</Window>
// Window1 constructor
public Window1()
{
    InitializeComponent();

    // Instantiating UIElements.
    DockPanel mainPanel = new DockPanel();
    Menu mainMenu = new Menu();
    MenuItem pasteMenuItem = new MenuItem();
    TextBox mainTextBox = new TextBox();

    // Associating the MenuItem with the Paste command.
    pasteMenuItem.Command = ApplicationCommands.Paste;

    // Setting properties on the TextBox.
    mainTextBox.Text =
        "The MenuItem will not be enabled until this TextBox receives keyboard focus.";
    mainTextBox.Margin = new Thickness(25);
    mainTextBox.BorderBrush = Brushes.Black;
    mainTextBox.BorderThickness = new Thickness(2);
    mainTextBox.TextWrapping = TextWrapping.Wrap;

    // Attaching UIElements to the Window.
    this.AddChild(mainPanel);
    mainMenu.Items.Add(pasteMenuItem);
    mainPanel.Children.Add(mainMenu);
    mainPanel.Children.Add(mainTextBox);

    // Defining DockPanel layout.
    DockPanel.SetDock(mainMenu, Dock.Top);
    DockPanel.SetDock(mainTextBox, Dock.Bottom);
}

请参见

任务

如何:将命令挂钩到不支持命令的控件

概念

命令概述