簡體   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