【发布时间】:2017-05-04 16:01:58
【问题描述】:
我正在设计一个 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。我会在管理这个的 UserControl 中有画布,所以它不必担心视图模型在做什么。然后,视图模型可以通过在其形状集合中的给定位置添加正确的形状来做出响应。
-
我最终做了什么。好眼@Will!
标签: c# wpf mvvm mouseevent cad