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

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

示例

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

构成这些类的静态 RoutedCommand 对象不提供命令逻辑。 命令的逻辑通过 CommandBinding 与命令相关联。 某些控件的部分命令具有内置的 CommandBindings。 这种机制可使命令的语义保持不变,而实际实现可以更改。 例如,TextBoxPaste 命令的处理方式与专门支持图像的控件对其的处理方式不同,后者的基本思路是通过粘贴让内容保持不变。 命令无法提供命令逻辑,但是控件或应用程序必须提供命令逻辑。

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

另请参阅