その1「ICommandインターフェース」:http://blogs.wankuma.com/kazuki/archive/2008/03/16/127903.aspx
その2「GUIにコマンドを結びつける」:http://blogs.wankuma.com/kazuki/archive/2008/03/16/127927.aspx
その3「ショートカットとコマンドを結びつける」:http://blogs.wankuma.com/kazuki/archive/2008/03/16/127931.aspx
その4「ショートカットとコマンドを結びつけるXAML版」:http://blogs.wankuma.com/kazuki/archive/2008/03/16/127934.aspx
今まで、その1で作ったHelloCommandを使いまわしてきたけど、今回でこいつともお別れ。
WPFには、RoutedCommandという便利なICommandの実装クラスが提供されているので、普通はそっちを使うことになってる。
WPF的には、コマンドは意味を表すのであってロジックは含まないものらしい。
ロジックはExecuteイベントとかに紐付けて行う。
この紐付けを行うためには、CommandBindingというものを使うらしい。後は、CommandBindingをWindowとかのCommandBindingsに登録することでバッチリ機能するようになるって寸法だ。
ということで、その4までのコードのHelloCommandをRoutedCommandに置き換えてみる。
using System.Windows;
using System.Windows.Input;
namespace WpfCommand
{
public partial class Window1 : Window
{
public static readonly ICommand HelloCommand = new RoutedCommand("HelloCommand", typeof(Window1));
public Window1()
{
InitializeComponent();
}
}
}
XAML側は前回と一緒
<Window x:Class="WpfCommand.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfCommand="clr-namespace:WpfCommand"
Title="コマンド" Height="300" Width="300">
<Window.InputBindings>
<KeyBinding Command="{x:Static WpfCommand:Window1.HelloCommand}" Key="G" Modifiers="Control" />
<MouseBinding Command="{x:Static WpfCommand:Window1.HelloCommand}">
<MouseBinding.Gesture>
<MouseGesture Modifiers="Control" MouseAction="LeftClick" />
</MouseBinding.Gesture>
</MouseBinding>
</Window.InputBindings>
<StackPanel>
<Button Name="button" Content="Click!" Command="{x:Static WpfCommand:Window1.HelloCommand}" />
</StackPanel>
</Window>
まだ何処にも「こんにちは世界」って表示するロジックを書いてないけど、とりあえず実行してみる。そうすると、ボタンがグレーになってクリック出来なくなってるのがわかる。当然クリックしても何も起きない。
この状態から、CommandBindingを使ってHelloCommandに「こんにちは世界」を表示するロジックを結び付けてみる。
using System.Windows;
using System.Windows.Input;
namespace WpfCommand
{
public partial class Window1 : Window
{
public static readonly ICommand HelloCommand = new RoutedCommand("HelloCommand", typeof(Window1));
public Window1()
{
InitializeComponent();
// HelloCommandとHelloCommand_Executedの関連を表すCommandBindingを作る
var helloCommandBinding = new CommandBinding(HelloCommand, HelloCommand_Executed);
// それを登録する
this.CommandBindings.Add(helloCommandBinding);
}
private void HelloCommand_Executed(object source, ExecutedRoutedEventArgs e)
{
MessageBox.Show("こんにちは世界");
}
}
}
これを実行すると、ボタンが押せるようになって「こんにちは世界」も表示されるようになる。
因みに、このCommandBindingの作成と登録もXAML側に移動させることが出来る。
移動させると下のような感じになる。
<Window x:Class="WpfCommand.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfCommand="clr-namespace:WpfCommand"
Title="コマンド" Height="300" Width="300">
<!-- コマンドバインディングの登録 -->
<Window.CommandBindings>
<CommandBinding Command="{x:Static WpfCommand:Window1.HelloCommand}" Executed="HelloCommand_Executed" />
</Window.CommandBindings>
<Window.InputBindings>
<KeyBinding Command="{x:Static WpfCommand:Window1.HelloCommand}" Key="G" Modifiers="Control" />
<MouseBinding Command="{x:Static WpfCommand:Window1.HelloCommand}">
<MouseBinding.Gesture>
<MouseGesture Modifiers="Control" MouseAction="LeftClick" />
</MouseBinding.Gesture>
</MouseBinding>
</Window.InputBindings>
<StackPanel>
<Button Name="button" Content="Click!" Command="{x:Static WpfCommand:Window1.HelloCommand}" />
</StackPanel>
</Window>