その7:http://blogs.wankuma.com/kazuki/archive/2008/03/20/128720.aspx
さて、WPFのコマンドというものは、意味を定義するもので実装(動作)は定義しないものでした。
前回の例だと、HelloとWorldというコマンドを定義している。このHelloとWorld自信は、実行されたからって何が起きるということには一切関与してない。
あくまで、メニューやボタンはHelloやWorldしますよということを示してる。
んで、HelloとWorldは何をしますという動作はCommandBindingでイベントハンドラと紐付けを行っています。
いいことだとは思いませんが、例えばHelloコマンドにDBからデータを取得してきて整形して出力するみたいな処理を書いてもOKです。
こういう風になってくると、アプリケーションで共通のコマンドっていくつかあるよね?という事が考えられます。
どのプログラムのメニューを見ても大体あるコピーや開くや終了といったもの。
WPFのコマンドの仕組みだと、毎回同じようなものを定義することになりそうです。
ということで、WPFには予めいくつかのコマンドが定義されています。
以下その一覧
例えば、ApplicationCommandsにあるCloseコマンドとかは、ほぼすべてのアプリケーションで使うんじゃないかと思う。
なんたって閉じるですから。
ということで使ってみます。
適当にプロジェクトを作成してWindow1にメニューを追加します。メニューには、ApplicationCommands.CloseをCommandプロパティにもつものを1つ用意。
CommandBindingでClose_Executedメソッドにバインドしてます。
<Window x:Class="WpfDefCommand.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="こまんど その8" Height="250" Width="250">
<Window.CommandBindings>
<!-- Closeコマンドが発行されたらClose_Executedを呼びます -->
<CommandBinding Command="Close" Executed="Close_Executed" />
</Window.CommandBindings>
<Grid>
<Menu>
<MenuItem Header="ファイル(_F)">
<!-- このメニューを押すとCloseコマンドを発行します -->
<MenuItem Command="Close" />
</MenuItem>
</Menu>
</Grid>
</Window>
コード側はClose_Executedでthis.Close()をしているだけ。
using System.Windows;
namespace WpfDefCommand
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void Close_Executed(object sender, RoutedEventArgs e)
{
// 自分自身を閉じます
this.Close();
}
}
}
これを実行すると、閉じるメニューがある下のような画面が出てくる。当然閉じるを押すと閉じる。
ということで、共通的に使われそうなコマンドは予め用意されてるので、出来ればそちらを使うようにしましょう。
さて、この例のXAMLを見てみるとわかるように、ApplicationCommandsのCloseコマンドは、Closeと指定するだけで設定できている。
これは、ApplicationCommandsが特別扱いされてるみたいで、文字列からコマンドへのコンバータが色々してくれているみたい。今日名前だけ紹介したほかの~Commandsクラスにあるコマンドも優遇されててクラス名.コマンド名で定義できるみたいだ。
ということで、定義されているコマンドは積極的につかったほうが楽そうです。