SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Silverlight/WPFで使える逆引きTips集

Silverlight/WPFで使える逆引きTips集
――メニュー機能

(10) MenuコントロールとContextMenuコントロール

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード Menu_WPF_VB.zip (71.1 KB)
ダウンロード Menu_WPF_CS.zip (65.4 KB)

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

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

 コマンドは 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;
}
ポイント

 メニューにコマンドを設定するにはMenuItemクラスのCommandプロパティを使用する。

 コマンドが実行できるかどうかのイベントはCanExecute属性で、コマンドが実行されたときのイベントはExecute属性に設定する。

次のページ
06.アイコンを設定する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Silverlight/WPFで使える逆引きTips集連載記事一覧

もっと読む

この記事の著者

HIRO(ヒロ)

HIRO's.NETのHIROです。とある半導体工場のSEです。VB.NET, C#, PowerShellによるプログラミングを楽しんでいます。最近はBlog でPowerShellについて書いています。2008/07/07にPowerShell from Japan!!というサイトを立ち上げまし...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5769 2011/03/03 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング