一次在画布上创建并移动一个点

时间:2014-06-18 06:37:37

标签: c# wpf mvvm

我遇到了在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

感谢你的帮助。

1 个答案:

答案 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;
}

实施的细节可能会根据您的架构而改变,但希望您明白这一点。