昨日コマンドの実装例をあげましたが、WPFには"イベント"という概念も存在します
コマンドについて先輩方のサイトを調べてみますと(MSDNだと解りにくかったり...)
コマンド : 意味論理的なイベント (ex. コピー / 貼り付けなど)
イベント : 実操作レベル (ex. クリック / キー入力など)
という違いがある模様
コマンドとしては、昨日の例のように
<Button Command="{Binding ButtonCommand}" Content="押すとテキストが変わるよ!" />
というように、
「マウスでボタンを押すとコマンドが実行される」
を"Command="で実行出来る
が、 この場合、"左クリック押下"以外は拾えないようだ
(右クリックとかは"イベント"という事になるのか?)
イベントを拾ってコマンドを実行する方法として"インプットバインディング"というものもあるようで、
<Window.InputBindings>
<KeyBinding Gesture="Alt+Shift+X"
Command="{Binding OkCommand}" />
<MouseBinding Gesture="Ctrl+WheelClick"
Command="{Binding OkCommand}" />
という書き方をすると"Ctrlキーを押しながらホイールを回す"イベントをコマンドとして実行することができる様子
(こちらを参考にしました http://www.atmarkit.co.jp/ait/articles/1011/09/news102_2.html
http://www.atmarkit.co.jp/ait/articles/1103/01/news124.html )
この場合のmouseactionはこちらで定義されており
http://msdn.microsoft.com/ja-jp/library/system.windows.input.mouseaction.aspx
こちらに列挙されているactionについてはcommandで実行できるようだ
たとえば昨日のコードに
<Grid>
<StackPanel>
<TextBlock Text="{Binding Text}" />
<Button Command="{Binding ButtonCommand}" Content="押すとテキストが変わるよ!" />
<Rectangle Width="100" Height="50" />
</StackPanel>
<Grid.InputBindings>
<MouseBinding Gesture="RightClick" Command="{Binding LButtonDownCommand}" />
</Grid.InputBindings>
</Grid>
としておき、コード側を
private DelegateCommand _lButtonDownCommand;
public DelegateCommand LButtonDownCommand
{
get
{
return _lButtonDownCommand ?? (_lButtonDownCommand = new DelegateCommand(
() =>
{
System.Diagnostics.Debug.WriteLine("R Button Down");
},
() =>
{
return true;
}
));
}
}
としておくと、Gridを右クリックするとdebugコードが出る
これでも出来ない場合は、直接"イベント"を拾う事が出来る"ビヘイビア"を使う...
という認識でいいのかな....
ビヘイビアの場合、Commandに用意されていないイベントなども使う事が出来るようだ
(マウスのクリックとその座標なども知ることができるようだ)
という感じで、
- コマンド : ICommandを使用。ViewModelで簡単実装
- ジェスチャー : ある程度ICommandで対応可能
- イベント : ビヘイビアを使用...若干面倒
という感じでしょうか...
0 件のコメント:
コメントを投稿