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

以下示例演示如何将 RoutedCommand 与内置支持命令的 Control 挂钩。 有关将命令挂钩到多个源的完整示例,请参阅创建自定义 RoutedCommand 示例示例。

Windows Presentation Foundation (WPF)提供了一个常见命令库,应用程序程序员经常遇到这些命令。 构成命令库的类包括:ApplicationCommandsComponentCommandsNavigationCommandsMediaCommandsEditingCommands

构成这些类的静态 RoutedCommand 对象不提供命令逻辑。 该命令的逻辑与标记为 CommandBinding的命令相关联。 某些控件的部分命令具有内置的 CommandBindings。 此机制允许命令的语义保持不变,而实际实现可能会更改。 例如,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="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://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);
}
' Window1 constructor
Public Sub New()
    InitializeComponent()

    ' Instantiating UIElements.
    Dim mainPanel As New DockPanel()
    Dim mainMenu As New Menu()
    Dim pasteMenuItem As New MenuItem()
    Dim mainTextBox As 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.
    Me.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)
End Sub

另请参阅