私はCADアプリケーションを設計しており、マウスイベントのイベント処理をきれいに設計する方法がわかりません。マウスイベントの結果として生じるさまざまなアクションを適切にフィルタリングするにはどうすればよいですか?
簡単にするために、UIにCreateSquareとCreateCircleという2つのボタンがあるとします。ユーザーがこれらのいずれかをクリックすると、アプリケーションはキャンバス内のクリックを待ち、ユーザーがクリックした後、特定された位置に四角形または円を作成します。私が理解から
は、それは私のキャンバスでのMouseDownイベントに耳を傾けることが必要だし、ハンドラで、何か書く:私は別の多くが作成されます、特別ので、臭いらしいしかし
bool CreatingSquaresMode;
bool CreatingCirclesMode;
private void ModelViewport_MouseDown(object sender, MouseButtonEventArgs e)
{
if (CreatingSquaresMode) {
// create square at selected position.
}
if (CreatingCirclesMode) {
// create circle at selected position.
}
}
をコマンドとそれはすぐに手を抜く。 CreateSquareとCreateCircleのボタンをコマンドにバインドして、MouseDownイベントについて心配する必要がないので、MVVMも壊れます。
私が考えてきた1つの代替案は、アプリケーションの可能なモードをすべて決定し、上記のネストまたはスイッチケースをもう少しエレガントに複製するステートマシンです。それはまだ正しい解決策ではないように感じますが、それはより良いでしょう。
第二の代替 - MouseDownイベントに耳を傾け、私のCreateSquareコマンド内で、何とかするだろう - 私は正しいものであると感じいずれかになります。
private void CreateSquare() {
//do something here
//wait for user mouse input
//create square
}
しかし、私はしないでくださいそれが可能であるかどうかを知る。
この状況を処理する正しい方法は何ですか?ここに私を助けてくれるデザインパターンがあると確信しています。
MVVMのタグが付いているので、ビューモデル内の各ボタンにICommandを設定する必要があります。これにより、ユーザーが行っていること(シェイプxの作成)が記憶されます。ユーザーがキャンバスを再びクリックすると、再びクリックの座標が送信されるICommandが必要になります。私はこれを管理しているUserControlにキャンバスを持っているので、ビューモデルが何をしているのか心配する必要はありません。次に、ビューモデルは、形状の集合内の所定の位置に正しい形状を追加することによって応答することができる。 – Will
私がやったことはかなり終わりです。良い目@ウィル! – celsound