我使用Shapes和Canvas,想制作类似于地图编辑器的东西。当鼠标在画布上移动时,我会在每次移动时将当前选定的对象绘制到鼠标位置的画布上,以便使用程序的人可以看到如果将该对象放置在那里,它将看起来像什么。
并且在鼠标单击时,我将当前对象/位置添加到一个列表中,该列表包含需要在每次更新时在画布上绘制的放置元素。
问题是,如果鼠标移动处理程序处于活动状态(绑定到画布),则不总是触发单击事件,我需要连续点击约十次才能放置元素。如果未绑定鼠标移动事件,则单击功能完美运行。
我制作了一个GIF来演示我的问题。
这是使用鼠标移动事件的情况
https://istack.dev59.com/qk3E6.gif
这是没有使用鼠标移动事件的情况
https://istack.dev59.com/QNrVF.gif
我认为这是因为移动事件过载了事件处理,并且没有资源来运行单击事件。
我如何同时使用这两个事件?
编辑
如建议所述,我附加了一些代码示例。
我有一个名为mapEditorModel的画布模型。对我们很重要的属性是mapEditorModel.MapObjects,它是包含需要绘制到画布上的元素的列表。
该列表包含一个包装器对象,其中包含有关元素的大量信息,对我们很重要的是,它包含用于绘制的预构建形状。
我有一个函数用于在画布上绘制元素:
并且在鼠标单击时,我将当前对象/位置添加到一个列表中,该列表包含需要在每次更新时在画布上绘制的放置元素。
问题是,如果鼠标移动处理程序处于活动状态(绑定到画布),则不总是触发单击事件,我需要连续点击约十次才能放置元素。如果未绑定鼠标移动事件,则单击功能完美运行。
我制作了一个GIF来演示我的问题。
这是使用鼠标移动事件的情况
https://istack.dev59.com/qk3E6.gif
这是没有使用鼠标移动事件的情况
https://istack.dev59.com/QNrVF.gif
我认为这是因为移动事件过载了事件处理,并且没有资源来运行单击事件。
我如何同时使用这两个事件?
编辑
如建议所述,我附加了一些代码示例。
我有一个名为mapEditorModel的画布模型。对我们很重要的属性是mapEditorModel.MapObjects,它是包含需要绘制到画布上的元素的列表。
该列表包含一个包装器对象,其中包含有关元素的大量信息,对我们很重要的是,它包含用于绘制的预构建形状。
我有一个函数用于在画布上绘制元素:
private void DrawElementOnCanvas(MapElementContainer item)
{
Rectangle shape = item.Shape;
CanvasElement.Children.Add(shape);
Canvas.SetLeft(shape, item.Position.X);
Canvas.SetTop(shape, item.Position.Y);
}
我有一个名为updateCanvas()
的方法,代码如下:
private void updateCanvas()
{
CanvasElement.Children.RemoveRange(0, CanvasElement.Children.Count);
foreach (MapElementContainer item in mapEditorModel.MapObjects)
{
DrawElementOnCanvas(item);
}
//CollisionDetection();
}
而两个事件方法是:
private void CanvasElement_MouseMove(object sender, MouseEventArgs e)
{
updateCanvas();
MapElementContainer mapObject = new MapElementContainer();
mapObject.Position = e.GetPosition((Canvas)sender);
mapObject.MapElement = new ContainerMapObject();
mapObject.CurrentRotateDegree = mapEditorModel.CurrentRotateDegree;
mapObject.Shape = BuildShape(mapObject);
DrawElementOnCanvas(mapObject);
}
private void CanvasElement_MouseDown(object sender, MouseButtonEventArgs e)
{
MapElementContainer mapObject = new MapElementContainer();
mapObject.Position = e.GetPosition((Canvas)sender);
mapObject.MapElement = new ContainerMapObject();
mapObject.CurrentRotateDegree = mapEditorModel.CurrentRotateDegree;
mapObject.Shape = BuildShape(mapObject);
mapEditorModel.MapObjects.Add(mapObject);
updateCanvas();
}
编辑2
如果我在鼠标移动函数中注释掉所有代码,那么我仍然不能在第一次单击时将任何元素放置在画布上,这可能是设计问题吗?