メニューにコマンドを設定する

スポンサーリンク

本TipsはWPFのみとなります。あらかじめご了承ください。

メニュー項目を選択したときに、イベントハンドラを呼び出して所定の処理を実行するにはコマンドを使用します。

コマンドは MenuItem クラスの Command プロパティを使用するのですが、これには定義済みのコマンドを割り当てることができます。

例えば、よく見られる「新規作成」というメニュー項目に対応した定義済みコマンドとしてApplicationCommandsクラスのNewプロパティがあります。ApplicationCommandsクラスについてMSDN を参照ください。

Command プロパティを使用すると、メニュー名やショートカットキーが自動で設定されます。

下記はCommandプロパティを使用して、メニューにコマンドを割り当てる例です。

対応するイベントの関連付けは <Window.CommandBindings>内で行っており、CanExecute 属性ではコマンドが実行できるかどうかを確認するためのイベントを、Execute属性ではコマンドが実行されたときのイベントをそれぞれ登録しています。特に必要がない場合には、CanExecute属性は省略しても構いません。

メニューにコマンドを設定する例

 

XAMLの例

<Window.CommandBindings>
    <!-- [ファイル]-[新規作成]用コマンド -->
    <CommandBinding Command="New" Executed="FileNewExecute" />
    <!-- [ファイル]-[保存]用コマンド -->
    <CommandBinding Command="SaveAs" Executed="FileSaveExecute" CanExecute="FileSaveCanExecute" />
</Window.CommandBindings>
<DockPanel Name="Dock1">
    <Menu DockPanel.Dock="Top">
        <MenuItem Header="ファイル(_F)" Name="MenuItem1">
            <MenuItem Header="新規作成(_N)" Command="New"/>
            <MenuItem Header="保存(_A)" Command="SaveAs"/>
            <Separator />
            <MenuItem Header="終了(_X)" />
        </MenuItem>
        <MenuItem Header="編集(_E)">
            <MenuItem Command="Cut"/>
            <MenuItem Command="Copy"/>
            <MenuItem Command="Paste"/>
        </MenuItem>
    </Menu>
    <TextBox Name="TextBox1" TextWrapping="Wrap" 
             AcceptsReturn="True"
             VerticalScrollBarVisibility="Visible" />
</DockPanel>

VBの例

'TextBoxの内容に変更があったかどうかを示すフラグ
'内容に変更があった場合にTrueとする
Private IsModified As Boolean = False

' [ファイル]-[新規作成]に対するコマンド
Private Sub FileNewExecute(ByVal sender As System.Object, ByVal e As System.Windows.Input.ExecutedRoutedEventArgs)
    MessageBox.Show("New")
End Sub


' [ファイル]-[保存]に対するコマンド
Private Sub FileSaveExecute(ByVal sender As System.Object, ByVal e As System.Windows.Input.ExecutedRoutedEventArgs)
    MessageBox.Show("Save")
End Sub

' [ファイル]-[保存]の実行可否を決定する
Private Sub FileSaveCanExecute(ByVal sender As System.Object, ByVal e As System.Windows.Input.CanExecuteRoutedEventArgs)
    'TextBoxの内容に変更があった場合
    If IsModified Then
        '[ファイル]-[保存]の実行を許可する
        e.CanExecute = True
    End If
End Sub

' テキストボックスの内容に変更があった場合の処理
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.TextChangedEventArgs) Handles TextBox1.TextChanged
    '内容が変更されたことを示すためフラグをTrueにする
    IsModified = True
End Sub

C#の例

// TextBoxの内容に変更があったかどうかを示すフラグ
// 内容に変更があった場合にTrueとする
private bool IsModified = false;

// [ファイル]-[新規作成]に対するコマンド
private void FileNewExecute(object sender, ExecutedRoutedEventArgs e)
{
    MessageBox.Show("New");
}

// [ファイル]-[保存]に対するコマンド
private void FileSaveExecute(object sender, ExecutedRoutedEventArgs e)
{
    MessageBox.Show("Save");
}

// [ファイル]-[保存]の実行可否を決定する
private void FileSaveCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    // TextBoxの内容に変更があった場合
    if (IsModified)
    {
        // [ファイル]-[保存]の実行を許可する
        e.CanExecute = true;
    }
}

// テキストボックスの内容に変更があった場合の処理
private void TextBox1_TextChanged(object sender, TextChangedEventArgs e)
{
    // 内容が変更されたことを示すためフラグをTrueにする
    IsModified = true;
}
タイトルとURLをコピーしました