次の方法で共有


方法: コマンドサポートを使用してコントロールにコマンドをフックする

次の例は、コマンドのサポートが組み込まれている RoutedCommandControl をフックする方法を示しています。 コマンドを複数のソースにフックする完全なサンプルについては、「Create a Custom RoutedCommand Sample サンプル」を参照してください。

Windows Presentation Foundation (WPF) には、アプリケーション プログラマが定期的に遭遇する一般的なコマンドのライブラリが用意されています。 コマンド ライブラリを構成するクラスは、ApplicationCommandsComponentCommandsNavigationCommandsMediaCommands、および EditingCommandsです。

これらのクラスを構成する静的 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="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

こちらも参照ください