方法: コマンドをサポートするコントロールにコマンドをフックする
次の例では、コマンドのサポートが組み込まれている Control に RoutedCommand をフックする方法を示します。 コマンドを複数のソースに関連付けるサンプル全体については、「カスタム RoutedCommand の作成のサンプル」を参照してください。
例
Windows Presentation Foundation (WPF) には、アプリケーション プログラマがよく使用する一般的なコマンドのライブラリが用意されています。 コマンド ライブラリを構成するクラスは、ApplicationCommands、ComponentCommands、NavigationCommands、MediaCommands、EditingCommands です。
これらのクラスを構成する静的な RoutedCommand オブジェクトには、コマンド ロジックが用意されていません。 コマンドのロジックは、CommandBinding でコマンドに関連付けられます。 一部のコントロールには、コマンドの CommandBindings が組み込まれています。 これにより、コマンドの意味は変わりませんが、実際の実装は変わる場合があります。 たとえば、TextBox は、Paste コマンドの処理方法が、イメージをサポートするよう設計されたコントロールとは異なります。ただし、何かを貼り付けるという基本的な概念は変わりません。 コマンド ロジックはコマンドでは提供できませんが、コントロールまたはアプリケーションで提供する必要があります。
WPF の多くのコントロールには、コマンド ライブラリにある一部のコマンドのサポートが組み込まれています。 たとえば、TextBox では、Paste、Copy、Cut、Redo、Undo などの多くのアプリケーション編集コマンドがサポートされます。 アプリケーション開発者は、コントロールで使用するこれらのコマンドを取得するのに特別な作業を行う必要はありません。 TextBox がコマンド ターゲットである場合は、コマンドを実行すると、コントロールに組み込まれている CommandBinding を使用してコマンドが処理されます。
Paste コマンドのコマンド ソースとして MenuItem を使用する方法を以下に示します。この場合、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
関連項目
.NET Desktop feedback