その6
http://blogs.wankuma.com/kazuki/archive/2008/03/18/128203.aspx
RoutedCommandっていうのをやったけど、これを継承してさらに拡張されたコマンドがある!
それが、RoutedUICommand。
このクラスを見てみるとわかるけど、Textプロパティが追加されただけで後は変わらん!という素っ気無い拡張が施されてる。
このTextプロパティって何に役立つのかというと…とりあえずMenuItemとかに関連付けたときに効果が見て取れる。
ということでどうなるか見てみよう。
プロジェクトを新規にWpfUICommandという名前で作る。そして、Window1.xaml.csにHelloとWorldという名前でpublic static readonly RoutedUICommandの定数を作る。コマンドは、Ctrl + HとCtrl + Wに関連付けもしてみよう。
ということで下のようなコードになる。
using System.Windows;
using System.Windows.Input;
namespace WpfUICommand
{
public partial class Window1 : Window
{
public static readonly RoutedUICommand Hello;
public static readonly RoutedUICommand World;
static Window1()
{
// Helloコマンドの初期化
Hello = new RoutedUICommand("はろぅ", "Hello", typeof(Window1));
// Ctrl + Hで動くようにする
Hello.InputGestures.Add(new KeyGesture(Key.H, ModifierKeys.Control));
// Worldコマンドの初期化
World = new RoutedUICommand("わぁるど", "World", typeof(Window1));
// Ctrl + Wで動くようにする
World.InputGestures.Add(new KeyGesture(Key.W, ModifierKeys.Control));
}
public Window1()
{
InitializeComponent();
}
}
}
RoutedUICommandのコンストラクタの第一引数がTextプロパティに設定する値になる。残りはRoutedCommandと一緒。
んで、このコマンドをメニューに関連付けてみようと思う。ついでにCommandBindingを使って適当なイベントにも紐付ける。
<Window x:Class="WpfUICommand.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfUICommand="clr-namespace:WpfUICommand"
Title="Window1" Height="300" Width="300">
<!-- コマンドとイベントの紐付け -->
<Window.CommandBindings>
<CommandBinding Command="{x:Static WpfUICommand:Window1.Hello}" Executed="helloBinding_Executed" />
<CommandBinding Command="{x:Static WpfUICommand:Window1.World}" Executed="worldBinding_Executed" />
</Window.CommandBindings>
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="おれおれ">
<!-- メニューアイテムとコマンドの紐付け -->
<MenuItem Command="{x:Static WpfUICommand:Window1.Hello}" />
<MenuItem Command="{x:Static WpfUICommand:Window1.World}" />
</MenuItem>
</Menu>
<Grid>
</Grid>
</DockPanel>
</Window>
CommandBindingで指定したイベントの定義をWindow1.xaml.csのほうに追加して実装する。とりあえず、ここのコードは本筋じゃないのでMessageBoxではろ~とか表示するだけにしておく。
private void helloBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("はろ~");
}
private void worldBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("わ~るど");
}
XAMLのほうを見てわかるように、MenuItemはコマンドプロパティを設定してるだけで、何も表示するようには設定してない。
でも、実行してみるとRoutedUICommandのTextプロパティとかInputGesturesに追加したKeyGestureも表示される。
もちろんクリックするとメッセージボックスまで表示されます。
うん。いい感じ。