定義済みコマンドを使っていこう

既に定義がされているコマンドがいくつかあります。

System.Windows.Input 名前空間

  • ComponentCommands
     ちょっと特殊。あまり使う機会はないんじゃなかろうか
  • MediaCommands
     Play や Stop など音楽や動画を扱うときに便利なコマンドを持つ
  • NavigationCommands
     ブラウザに類似したコマンドを持つ


System.Windows.Documents 名前空間

  • 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>

文字もショートカットキーも出てる!!便利ー!!
f:id:kitunechan:20151112182715p:plain

ショートカットキーの追加

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>

やったぜ!
f:id:kitunechan:20151112183938p:plain

参考:http://blogs.wankuma.com/kazuki/archive/2008/03/20/128720.aspx