在wpf上,为了在画布上拖动和移动项目(形状,子画布),我已经实施了针对问题的答案:How to drag a UserControl inside a Canvas。然而,由于正确地指出了同样的问题的答案旁边还有里面的方法有缺陷,更改形状的实际位置
private void Control_MouseMove(object sender, MouseEventArgs e)
{
var draggableControl = sender as UserControl;
if (isDragging && draggableControl != null)
{
Point currentPosition = e.GetPosition(this.Parent as UIElement);
var transform = draggableControl.RenderTransform as TranslateTransform;
if (transform == null)
{
transform = new TranslateTransform();
draggableControl.RenderTransform = transform;
}
transform.X = currentPosition.X - clickPosition.X;
transform.Y = currentPosition.Y - clickPosition.Y;
}
}
它使用不永久改变项目的位置RenderTranform但它的可视位置来代替。结果是该项目仅在下一个鼠标事件时返回到其初始位置,所以拖放操作无法正常进行(您不能以这种方式实际移动它,但仅在视觉上)。应对其进行何种修改纠正方法的功能?还有一种类似的做法能够正确执行任务吗?我应该使用另一种变换,如布局变换?
控件的位置被重置的事实与RenderTransform的使用无关,如果有的话只是不好的编码。 –
查看http://msdn.microsoft.com/en-us/library/system.windows.uielement.rendertransform.aspx中的备注。它讲述的是一种“暂时效应”。 – arjacsoh
这并不改变这样一个事实,即一个*可以*持续写入拖动功能。 –