05.メニューにコマンドを設定する
メニュー項目を選択したときに、イベントハンドラを呼び出して所定の処理を実行するにはコマンドを使用します。
コマンドは MenuItem クラスの Command プロパティを使用するのですが、これには定義済みのコマンドを割り当てることができます。
例えば、よく見られる「新規作成」というメニュー項目に対応した定義済みコマンドとしてApplicationCommandsクラスのNewプロパティがあります。ApplicationCommandsクラスについてはMSDNを参照ください。
Command プロパティを使用すると、メニュー名やショートカットキーが自動で設定されます。
下記はCommandプロパティを使用して、メニューにコマンドを割り当てる例です。
対応するイベントの関連付けは <Window.CommandBindings>内で行っており、CanExecute 属性ではコマンドが実行できるかどうかを確認するためのイベントを、Execute属性ではコマンドが実行されたときのイベントをそれぞれ登録しています。特に必要がない場合には、CanExecute属性は省略しても構いません。
<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>
'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
// 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; }
メニューにコマンドを設定するにはMenuItemクラスのCommandプロパティを使用する。
コマンドが実行できるかどうかのイベントはCanExecute属性で、コマンドが実行されたときのイベントはExecute属性に設定する。