2009年09月13日

WPFのRoutedCommandとCommandBinding

ふつーに、WPFなアプリを作ってて、行き詰まりというか、悩んでたことが、解決した。
解決した内容とかは、他のWebサイトとかにも載ってる内容なのでそっちを参考にするっとφ(。。
気が向いたら概要を図にまとめてもいいかな、と思う。
どちらにしても、そこにたどり着いた道筋は、残しておこう。
結局、いろんなサイト見たけど、失敗ケースをやるまで良くわからなかったから。


例1:アプリでUIイベント処理したい。
☆対応1:
 ・通常のWindowに対してメソッド作成した。
 ・Windowに操作対象Objectを保持した。
 ・Windowの中のButtonからメソッドを呼んだ。
 結果:
  できた。
 問題点:
  ButtonとWindowが切り離せない。
WPFCommandBinding01.png


例2:例1に対してUIイベント処理を非同期化したい。
☆対応1:
 ・メソッドに対してdelegateを宣言、代入した。
 結果:UIに対する結果反映処理が別スレッドからの処理となりエラー。
☆対応2:
 ・BackgroundWorkerを使った。
 結果:
  できた。
 問題点:
  操作対象objectがWindowにあるので、以下のどちらかにする必要がある。
  1.thisアクセスする
  2.イベントのResult等にobjectを入れて引き回す
  1の場合は、非同期処理をするメソッドと、後処理のメソッドは同クラスから切り離せない。


例3:例2に対して、別の場所から操作対象を処理したい。
☆対応1:
 ・別ユーザーコントロールを作った。
 ・ユーザーコントロールに例1と同様にobjectを保持した。
 ・ユーザーコントロールに例2と同様にメソッドを作成した。
 結果:
  できた。
 問題点:
  処理は出来たが、他のUIに処理結果が反映できなかった。


ここで、前から疑問に想っていたICommandとRoutedCommandとCommandBinding言うものが良くわかった。
作りながらも3回くらい、調べては、あきらめを繰り返してきたけど、
これらを(これらも)解決できる仕掛けの提供になっているんだね。
もっと洗練できそうな気もするけど。

ちょうど、想像してた仕掛けの解説っぽい記事を発見したので張っておこうっと。
antsk blog : WPFのCommand
自分の見たかった図とかが載ってた。
これを基準にPreviewExecuteとかExecutedを利用すればよさげ。
うみゅ、満足(゜▽、゜ねむいゾ
posted by すふぃあ at 13:03| Comment(0) | TrackBack(0) | プログラム
この記事へのコメント
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/32099614

この記事へのトラックバック