【发布时间】:2011-11-04 10:12:03
【问题描述】:
在 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 的使用无关,如果有的话,这只是糟糕的编码。
-
看msdn.microsoft.com/en-us/library/…的备注。它谈到了“暂时的影响”。
-
这并没有改变一个事实,即一个人可以使用它编写持久的拖动功能。
标签: c# wpf drag-and-drop