繁体   English   中英

拖动用户控件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM