0

だから私は窓の周りに移動できるようにをBorder持っています。TranslateTransformIのコンテンツ内Borderには、多数のコントロールとScrollViewer. ドラッグは正常に機能しますが、スクロールバーをクリックすると境界線全体がジャンプして、カーソルが最後にクリックしたポイントに移動します。非常に迷惑で、スクロールバーで発生しているのに他のコントロールでは発生していない理由がわかりません。

(Denis Morozov のシンプルで優れたガイドhttp://denismorozov.blogspot.ie/2008/01/drag-controls-in-wpf-using.htmlを使用しています)

これが私がコードで行っていることです。

private void Canvas_MouseDown(object sender, MouseButtonEventArgs e)
    {
        this.current.X = Mouse.GetPosition((IInputElement)sender).X;
        this.current.Y = Mouse.GetPosition((IInputElement)sender).Y;

        // Ensure object receives all mouse events.
        this.current.InputElement.CaptureMouse();
    }

    private void Canvas_MouseUp(object sender, MouseButtonEventArgs e)
    {
        if (this.current.InputElement != null)
            this.current.InputElement.ReleaseMouseCapture();
    }

    private void Canvas_MouseMove(object sender, MouseEventArgs e)
    {
        // if mouse is down when its moving, then it's dragging current
        if (e.LeftButton == MouseButtonState.Pressed)
            this.current.IsDragging = true;
        else
            this.current.IsDragging = false;

        if (this.current.IsDragging && current.InputElement != null)
        {
            // Retrieve the current position of the mouse.
            double newX = Mouse.GetPosition((IInputElement)sender).X;
            double newY = Mouse.GetPosition((IInputElement)sender).Y;

            // Reset the location of the object (add to sender's renderTransform

            // newPosition minus currentElement's position
            Transform rt = ((UIElement)this.current.InputElement).RenderTransform;
            double offsetX = rt.Value.OffsetX;
            double offsetY = rt.Value.OffsetY;
            rt.SetValue(TranslateTransform.XProperty, offsetX + newX - current.X);
            rt.SetValue(TranslateTransform.YProperty, offsetY + newY - current.Y);

            // Update position of the mouse
            current.X = newX;
            current.Y = newY;
        }
    }

    public void MouseLeftBtnDown(object sender, MouseButtonEventArgs e)
    {
        this.current.InputElement = (IInputElement)sender;
    }
4

1 に答える 1

0

Denis のページのコメントで実際に見つけました。問題は、上のものをリセットしないことにありましたCanvas_MouseUp。その方法は実際にはそうあるべきです。

if (this.current.InputElement != null)
{
this.current.IsDragging = false;
this.current.InputElement.ReleaseMouseCapture();
this.current.InputElement = null;
}

今では魅力のように動作します;)

于 2012-07-06T10:55:18.757 に答える