共用方式為


如何:將命令與含有命令支援的控制項連結

下列範例示範如何將 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

另請參閱