[英]Dragging a User Control
我正在尝试使 UserControl 可拖动,但我被卡住了,我不知道为什么。
基于这里的答案: 如何在画布内拖动用户控件
这部分代码是我卡住的地方:
private void Control_MouseMove(object sender, MouseEventArgs e)
{
var userControl= sender as UserControl;
Point currentPosition = e.GetPosition(userControl);
var transform = userControl.RenderTransform as TranslateTransform;
if (transform == null)
{
transform = new TranslateTransform();
userControl.RenderTransform = transform;
}
transform.X = currentPosition.X - clickPosition.X;
transform.Y = currentPosition.Y - clickPosition.Y;
}
}
发生的情况是,在拖动时,控件从新位置到旧位置来回跳跃。
当我将上面的代码更改为:
Point currentPosition = e.GetPosition(null);
拖动没有跳回原来的位置,但它显然是偏移的。 有问题的 UserControl 没有父控件(在 this.Parent 为空的意义上)。
解决方案可能很明显,但我只是没有看到。 有任何想法吗?
使用LayoutTransform
。 RenderTransform
仅使UIElement“看起来像”它处于新位置。 这意味着事件第一次触发(第一个动作)时,它便按预期工作,但是此后位置仍处于原始位置,但是正在对其进行渲染转换以使其看起来已经移动了-这使您的移动事件成为可能疯了。
我认为,最好将控件包装在Canvas中。 通常不建议使用LayoutTransform
。
Step1:在UserControl中添加属性
Point _anchorPoint;
Point _currentPoint;
bool _isInDrag;
private readonly TranslateTransform _transform = new TranslateTransform();
第 2 步:使用以下 EventHandler 初始化您的构造函数
this.MouseLeftButtonDown += new MouseButtonEventHandler(Control_MouseLeftButtonDown);
this.MouseLeftButtonUp += new MouseButtonEventHandler(Control_MouseLeftButtonUp);
this.MouseMove += new MouseEventHandler(Control_MouseMove);
3.实现事件方法
private void Control_MouseMove(object sender, MouseEventArgs e)
{
if (!_isInDrag) return;
_currentPoint = e.GetPosition(null);
//This is the change to the position that we want to apply
Point delta = new Point();
delta.X = _currentPoint.X - _anchorPoint.X;
delta.Y = _currentPoint.Y - _anchorPoint.Y;
//Calculate user control edges
var leftEdge = Margin.Left + _transform.X + delta.X;
var topEdge = Margin.Top + _transform.Y + delta.Y;
var rightEdge = Width + Margin.Left + _transform.X + delta.X;
var bottomEdge = Height + Margin.Top + _transform.Y + delta.Y;
//Set the delta to 0 if it goes over _parentGrid edges
if (leftEdge < 0) delta.X = 0;
if (topEdge < 0) delta.Y = 0;
//_ParentGridName is called from MDIParent.GridName
if (rightEdge > _ParentGridName.Width) delta.X = 0;
if (bottomEdge > _ParentGridName.Height) delta.Y = 0;
//Apply the delta to the user control
_transform.X += delta.X;
_transform.Y += delta.Y;
RenderTransform = _transform;
_anchorPoint = _currentPoint;
}
private void Control_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (_isInDrag)
{
var element = sender as FrameworkElement;
element.ReleaseMouseCapture();
_isInDrag = false;
e.Handled = true;
}
}
private void Control_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var element = sender as FrameworkElement;
_anchorPoint = e.GetPosition(null);
if (element != null) element.CaptureMouse();
_isInDrag = true;
e.Handled = true;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.