2013年4月8日月曜日

コマンドとイベントとインプットバインディング

昨日コマンドの実装例をあげましたが、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 件のコメント:

コメントを投稿