方法: コマンドを有効にする

次の例では、Windows Presentation Foundation (WPF) でコマンドを使用する方法を示します。 この例では、RoutedCommandButton に関連付け、CommandBinding を作成し、RoutedCommand を実装するイベント ハンドラーを作成する方法を示します。 コマンド実行の詳細については、「コマンド実行の概要」を参照してください。

コードの最初のセクションでは ButtonStackPanel で構成されるユーザー インターフェイス (UI) が作成され、RoutedCommand とコマンド ハンドラーを関連付ける CommandBinding が作成されます。

ButtonCommand プロパティは Close コマンドと関連付けられます。

CommandBinding はルート WindowCommandBindingCollection に追加されます。 イベント ハンドラーの ExecutedCanExecute はこのバインディングに添付され、Close コマンドと関連付けられます。

CommandBinding なしではコマンド ロジックはなく、コマンドを呼び出すメカニズムのみが存在します。 Button がクリックされると、コマンド ターゲットで PreviewExecuted RoutedEvent が発生し、それに Executed RoutedEvent が続きます。 これらのイベントによって、その特定のコマンドの CommandBinding を探すために要素ツリーが走査されます。 RoutedEvent のトンネリングおよびバブリングでは要素ツリーを通過するため、CommandBinding の配置場所には注意が必要である点にご留意ください。 CommandBinding がコマンド ターゲットの兄弟ノード上にあるか、RoutedEvent のルート上にはない別のノード上にある場合、CommandBinding はアクセスされません。

<Window x:Class="WCSamples.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="CloseCommand"
    Name="RootWindow"
    >
  <Window.CommandBindings>
    <CommandBinding Command="ApplicationCommands.Close"
                    Executed="CloseCommandHandler"
                    CanExecute="CanExecuteHandler"
                    />
  </Window.CommandBindings>
  <StackPanel Name="MainStackPanel">
    <Button Command="ApplicationCommands.Close" 
            Content="Close File" />
  </StackPanel>
</Window>
// Create ui elements.
StackPanel CloseCmdStackPanel = new StackPanel();
Button CloseCmdButton = new Button();
CloseCmdStackPanel.Children.Add(CloseCmdButton);

// Set Button's properties.
CloseCmdButton.Content = "Close File";
CloseCmdButton.Command = ApplicationCommands.Close;

// Create the CommandBinding.
CommandBinding CloseCommandBinding = new CommandBinding(
    ApplicationCommands.Close, CloseCommandHandler, CanExecuteHandler);

// Add the CommandBinding to the root Window.
RootWindow.CommandBindings.Add(CloseCommandBinding);
' Create ui elements.
Dim CloseCmdStackPanel As New StackPanel()
Dim CloseCmdButton As New Button()
CloseCmdStackPanel.Children.Add(CloseCmdButton)

' Set Button's properties.
CloseCmdButton.Content = "Close File"
CloseCmdButton.Command = ApplicationCommands.Close

' Create the CommandBinding.
Dim CloseCommandBinding As New CommandBinding(ApplicationCommands.Close, AddressOf CloseCommandHandler, AddressOf CanExecuteHandler)

' Add the CommandBinding to the root Window.
RootWindow.CommandBindings.Add(CloseCommandBinding)

コードの次のセクションでは、イベント ハンドラーの ExecutedCanExecute が実装されます。

Executed ハンドラーにより、開いているファイルを閉じるメソッドが呼び出されます。 CanExecute ハンドラーにより、ファイルが開いているかどうかを判断するメソッドが呼び出されます。 ファイルが開いている場合、CanExecutetrue に設定されます。それ以外の場合、false に設定されます。

// Executed event handler.
private void CloseCommandHandler(object sender, ExecutedRoutedEventArgs e)
{
    // Calls a method to close the file and release resources.
    CloseFile();
}

// CanExecute event handler.
private void CanExecuteHandler(object sender, CanExecuteRoutedEventArgs e)
{
    // Call a method to determine if there is a file open.
    // If there is a file open, then set CanExecute to true.
    if (IsFileOpened())
    {
        e.CanExecute = true;
    }
    // if there is not a file open, then set CanExecute to false.
    else
    {
        e.CanExecute = false;
    }
}
' Executed event handler.
Private Sub CloseCommandHandler(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs)
    ' Calls a method to close the file and release resources.
    CloseFile()
End Sub

' CanExecute event handler.
Private Sub CanExecuteHandler(ByVal sender As Object, ByVal e As CanExecuteRoutedEventArgs)
    ' Call a method to determine if there is a file open.
    ' If there is a file open, then set CanExecute to true.
    If IsFileOpened() Then
        e.CanExecute = True
    ' if there is not a file open, then set CanExecute to false.
    Else
        e.CanExecute = False
    End If
End Sub

関連項目