定義済みコマンドを使っていこう
既に定義がされているコマンドがいくつかあります。
- http://msdn.microsoft.com/ja-jp/library/system.windows.input.applicationcommands.aspx
Open や Save など一般的なアプリケーションで有用なコマンドを持つ
- ComponentCommands
ちょっと特殊。あまり使う機会はないんじゃなかろうか
- MediaCommands
Play や Stop など音楽や動画を扱うときに便利なコマンドを持つ
- NavigationCommands
ブラウザに類似したコマンドを持つ
- EditingCommands
エディタでよく使われるコマンドを持つ
ショートカットキーが定義されていたり、Copy、Pasteなどに至っては各コントロールにより処理が入っていたりして便利です。
これを使わない手はない!と思ったのですが、手順がわかるまでが大変でした。
処理の追加
Windowクラス(UIElementなら何でもOK)のCommandBindingsで処理を追加します。
※ 方法がいくつかあるので一つの手段として見て下さい。
public partial class MainWindow: Window { public MainWindow() { InitializeComponent(); this.CommandBindings.Add( new CommandBinding( ApplicationCommands.New, New, CanNew ) ); } // 実行されるメソッド public void New( object sender, ExecutedRoutedEventArgs e ){ MessageBox.Show( "New" ); } // こんなのでもおっけー //public ExecutedRoutedEventHandler New { // get { // return ( s, e ) => { // MessageBox.Show( "New" ); // }; // } //} public void CanNew ( object sender, CanExecuteRoutedEventArgs e ){ // 実行できるなら e.CanExecute = true; // 実行できない(グレー表示)なら e.CanExecute = false; e.CanExecute = true; } }
この記述で
<Menu DockPanel.Dock="Top" Margin="0,0,0,1"> <MenuItem Header="ファイル(_F)"> <MenuItem Command="New"/> </MenuItem> </Menu>
文字もショートカットキーも出てる!!便利ー!!
ショートカットキーの追加
Newコマンドでは Ctrl+N が初めから定義されていましたが、名前を付けて保存 の SaveAs にはショートカットキーが割り当てられていませんでした。
自分で割り当てろってことですね。
ショートカットキーを割り当てて、Ctrl+Shift+S の表示もさせるにはデザインが出来上がる前に記述する必要がありました。
つまり ApplicationCommands.SaveAs に Ctrl+Shift+S を割り当てるには InitializeComponent より前に書いてしまうか、
public MainWindow() { ApplicationCommands.SaveAs.InputGestures.Add( new KeyGesture( Key.S, ModifierKeys.Control | ModifierKeys.Shift ) ); InitializeComponent(); }
静的コンストラクタ(Static)に追加して最速で呼び出します。
static MainWindow() { ApplicationCommands.SaveAs.InputGestures.Add( new KeyGesture( Key.S, ModifierKeys.Control | ModifierKeys.Shift ) ); }
全体像はこんな感じになりました。
public partial class MainWindow: Window { public MainWindow() { InitializeComponent(); this.CommandBindings.Add( new CommandBinding( ApplicationCommands.New, New, CanNew ) ); // SaveAs はラムダ式で強引に書いちゃう this.CommandBindings.Add( new CommandBinding( ApplicationCommands.SaveAs, ( s, e ) => { MessageBox.Show( "SaveAs" ); } ) ); } static MainWindow() { ApplicationCommands.SaveAs.InputGestures.Add( new KeyGesture( Key.S, ModifierKeys.Control | ModifierKeys.Shift ) ); } // 実行されるメソッド public void New( object sender, ExecutedRoutedEventArgs e ) { MessageBox.Show( "New" ); } // こんなのでもおっけー //public ExecutedRoutedEventHandler New { // get { // return ( s, e ) => { // MessageBox.Show( "New" ); // }; // } //} public void CanNew( object sender, CanExecuteRoutedEventArgs e ) { // 実行できるなら e.CanExecute = true; // 実行できない(グレー表示)なら e.CanExecute = false; e.CanExecute = true; } }
Xaml部
<Window x:Class="LivetWPFApplication1.Views.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <DockPanel> <Menu DockPanel.Dock="Top"> <MenuItem Header="ファイル"> <MenuItem Command="New"/> <MenuItem Command="SaveAs"/> </MenuItem> </Menu> <DockPanel></DockPanel> </DockPanel> </Window>
やったぜ!
参考:http://blogs.wankuma.com/kazuki/archive/2008/03/20/128720.aspx