我遇到了在WPF MVVM中创建和移动一个点(椭圆)的问题。
现在我有一个RelayCommand,它在我的vm中调用我的创建点处理程序,它创建一个命令并执行它:
private void CreatePointHandler(MouseEventArgs e)
{
AddConnectionPointCommand addConnectionPointCommand = new AddConnectionPointCommand(this, e);
PetriNetViewModel.ExecuteCommand(addConnectionPointCommand);
}
此外,对于已经存在的一点,我还有一个Move处理程序(在另一个vm tho中):
public void MovePointHandler(ConnectionPoint pointMoved, Point oldLocation, Point newLocation)
{
Vector move = new Vector(newLocation.X - oldLocation.X, newLocation.Y - oldLocation.Y);
PetriNetViewModel.ExecuteCommand(new MoveDragCanvasElementsCommand(new ConnectionPoint[] { pointMoved }, move));
}
之后添加和移动一点只是按预期工作。
现在,我想让用户可以一步添加和移动一个点。在我的CreatePointHandler
中,我可以弄清楚左鼠标是否仍然像这样按下:
if (e.LeftButton == MouseButtonState.Pressed) {
}
但我现在该怎么说呢? MovePointHandler
由代码隐藏中的事件调用(我知道这不应该在mvvm中完成,但我的同事们,我认为如果你没有太多的代码就可以了) ,这也传递了我在这里没有的ElementsMovedEventArgs
。
感谢你的帮助。
答案 0 :(得分:0)
如果没有看到调用这些处理程序的代码隐藏,很难说。
我原本以为你应该有一个 SelectedPoint 的概念,你可以随时检查鼠标移动时是否发生了预期的拖拽。
即
private ConnectionPoint SelectedPoint { get; set; }
private void OnMouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
// dragging something.. check if there is a point selected
if (SelectedPoint != null)
{
_viewModel.MovePointHandler(SelectedPoint, _oldLocation, _newLocation);
}
}
}
然后,作为 CreatePointHandler 的一部分,您可以立即将新创建的实例设置为 SelectedPoint ,直到检测到 MouseUp 。 / p>
private void ExecuteAddConnectionPointCommand()
{
// standard logic...
ConnectionPoint addedPoint = ...
SelectedPoint = addedPoint;
}
实施的细节可能会根据您的架构而改变,但希望您明白这一点。