我正在設計一個CAD應用程序,我不確定如何以一種乾淨的方式設計鼠標事件的事件處理。如何正確過濾鼠標事件可能導致的不同操作?
爲簡單起見,假設我在UI中有兩個按鈕:CreateSquare和CreateCircle。當用戶單擊其中的一個時,我希望應用程序等待畫布中的點擊,並且在用戶單擊後,在已識別的位置創建一個正方形或圓形。
從我的理解,有必要來聽我的畫布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.
}
}
然而,似乎臭,特別是因爲我將有許多不同的創建命令,並迅速失控。它也打破了MVVM,因爲我希望將CreateSquare和CreateCircle按鈕綁定到命令,而不必擔心MouseDown事件。
我考慮過的一種替代方法是狀態機,我將確定應用程序的所有可能模式,並以更優雅的方式複製上面的if-nest或switch-case。它仍然覺得它不是正確的解決方案,但它會更好。
第二個選擇 - 這是一個我覺得是正確的 - 會以某種方式,我CreateSquare命令中,聽的MouseDown事件:
private void CreateSquare() {
//do something here
//wait for user mouse input
//create square
}
但我不知道這甚至是可能的。
處理這種情況的正確方法是什麼?我確定有一種設計模式應該可以幫助我。
它被標記爲MVVM,因此您應該爲視圖模型中的每個按鈕設置一個ICommand,然後它將記住用戶正在做什麼(創建形狀x)。當用戶再次點擊畫布時,您應該再次擁有發送點擊座標的ICommand。我在用戶控件的畫布中管理這個,所以它不必擔心視圖模型在做什麼。視圖模型然後可以通過在其形狀集合中的給定位置添加正確的形狀來作出響應。 – Will
我最終做了什麼。好眼睛@會! – celsound