
マウスイベント処理のオーダーメイド
お絵かきソフトに於いて、ポインティングデバイスで出来ること(そしてケアすべきこと)は数多い。
描画はもちろん、選択、変形ツールのドラッグ、Viewの拡縮なんてのもある。
これをどう処理するか。素人プログラマーの長年の命題に挑戦する。
問題点
(※データに無関係なイベントはView内で完結させるのでここではMVVMは語らない)
各コントロールで対応されているマウスイベントを普通にコードビハインドで受け取るとこうなる。
private void PreviewMouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
//マウスが動いたときの処理
}
規模が小さければこのまま書き込んでオワリにするが、先に述べたようにお絵かきツールではモードが多数ある。
それをこのメソッドで対応しようとすると…
private void PreviewMouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
switch(Mode)
{
case Mode.Select:
//選択時のマウスの動き
break;
case Mode.Draw:
//描画時のマウスの動き
break;
case Mode.Edit:
//編集時のマウスの動き
break;
.....
}
}
このように、モード分岐判定をかませることになる。
マウスが動くたびに、だ。
しかも、マウスが離れたとき、キーを押された時、空移動したとき、
すべてのイベントに於いてこのモード分岐判定を介入しなくてはいけない。
こんな無駄なロジックあるか???
考察
毎回IF処理…考えただけで虫唾が走る😫
いっそモードを切り替えるたびにユーザーコントロールを切り替えるか?
いや、煩雑過ぎる。メンテなんか最悪だ。
要は、モードを変えるたびに、イベントを処理する定義コードがごっそり入れ替わってくれりゃいいんだよ。そんな方法…
Delegateだ!
まとめ
思いつきなので実際どうなるか分からんが、これがうまく行ったらプログラムの質が20%くらい上がりそうだ。
Delegateって便利だなー!
よし、やるぞ!