RenderTransform Mouse.GetPosition

时间:2011-11-12 14:16:29

标签: wpf drag mousemove rendertransform

好的,更好的一些更正并仅适用于X坐标: 鉴于以下代码:

    private Point MouseDownPosition;

     private void OnStartDrag(object sender, MouseButtonEventArgs e)
    {
        if (!this.AssociatedObject.IsMouseCaptured)
        {
            this.AssociatedObject.AddHandler(FrameworkElement.MouseMoveEvent, new MouseEventHandler(this.OnDrag));
            this.AssociatedObject.RenderTransform = new TranslateTransform();
            this.MouseDownPosition = Mouse.GetPosition(null);
            Mouse.Capture(this.AssociatedObject, CaptureMode.Element);
        }
    }
    private void OnDrag(object sender, MouseEventArgs e)
    {
        if (this.AssociatedObject.IsMouseCaptured)
        {
            this.AssociatedObject.AddHandler(FrameworkElement.MouseLeftButtonUpEvent, new MouseButtonEventHandler(this.OnStopDrag));
            TranslateTransform Translate = this.AssociatedObject.RenderTransform as TranslateTransform;
            Point CurrentPosition = Mouse.GetPosition(null); 
            Translate.X = CurrentPosition.X - this.MouseDownPosition.X;
        }
    }
    private void OnStopDrag(object sender, MouseButtonEventArgs e)
    {
        if (this.AssociatedObject.IsMouseCaptured)
        {
            this.AssociatedObject.ReleaseMouseCapture();
            this.AssociatedObject.RemoveHandler(FrameworkElement.MouseMoveEvent, new MouseEventHandler(this.OnDrag));
            this.AssociatedObject.RemoveHandler(FrameworkElement.MouseLeftButtonUpEvent, new MouseButtonEventHandler(this.OnStopDrag));
        }
    }
  

1.(MouseLeftButtonDown)当我在拖动对象上单击第一次时,它正在正确移动。

2.(MouseMove)我将对象拖到ex的任意位置。在我的小组上100点。

3.(MouseLeftButtonUp)对象定位在我左侧拖拽的位置。

直到现在没有问题。但是当我开始第二次活动链时:

1.(MouseLeftButtonDown)拖动的对象移动到后面:

                         CurrentPointerPosition + FIRSTPosition

2。 (MouseMove)执行拖动移动但MousePointer位于CurrentPointerPosition + FIRSTPosition FROM拖动的对象。

3.(MouseLeftButtonUp)与第一次一样正确执行(但很明显)。

似乎在MouseLeftButtonDown上MouseDownPosition和拖动对象的位置必须重置...

为什么呢? 我做错了什么? 谢谢!

2 个答案:

答案 0 :(得分:2)

感谢MSDN上的“TheKiller556”,我根据布局变化找到了解决问题的正确方法,因此制作了真正的通用且强大的拖动行为。

无法解决RenderTransforms问题的链接似乎在复杂的逻辑面板上解决了Margin属性ALSO(已测试):

http://social.msdn.microsoft.com/Forums/en/wpf/thread/eb3a912b-1046-4902-8c7a-bbc0566209c0

我希望将来在变换问题中会有一个深刻的解释。 谢谢大家! (我知道我不能自己投票,但如果有人深入了解我的帖子,我有效地找到了一个解决方案,所以,如果有可能的话,我想知道我是否可以获得一些积分。) 再次感谢你!

答案 1 :(得分:0)

好的,经过几个小时的挖掘,我终于找到了解决方案。 我祈祷每个人在WPF / Silverlight中真正体验到解释我(以及其他有这个问题的人)为什么我的代码工作正常,因为,真诚地,我找不到合乎逻辑的理由:

public class DragBehavior : Behavior<FrameworkElement>
{
    #region Constructors

    static DragBehavior()
    {
    }
    public DragBehavior()
    {
    }

    #endregion

    private Point MouseDownPosition;

    protected override void OnAttached()
    {
        this.AssociatedObject.AddHandler(FrameworkElement.MouseLeftButtonDownEvent, new      MouseButtonEventHandler(this.OnStartDrag));
        this.AssociatedObject.RenderTransform = new TranslateTransform();
        this.AssociatedObject.UpdateLayout();
        base.OnAttached();
    }
    protected override void OnDetaching()
    {
        this.AssociatedObject.RenderTransform = null;
        this.AssociatedObject.RemoveHandler(FrameworkElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(this.OnStartDrag));
        base.OnDetaching();
    }

    private void OnStartDrag(object sender, MouseButtonEventArgs e)
    {
        if (!this.AssociatedObject.IsMouseCaptured)
        {
            this.AssociatedObject.AddHandler(FrameworkElement.MouseMoveEvent, new MouseEventHandler(this.OnDrag));
            this.MouseDownPosition = Mouse.GetPosition(this.AssociatedObject);

            Mouse.Capture(this.AssociatedObject, CaptureMode.SubTree);
        }
    }
    private void OnDrag(object sender, MouseEventArgs e)
    {
        if (this.AssociatedObject.IsMouseCaptured)
        {
            this.AssociatedObject.AddHandler(FrameworkElement.MouseLeftButtonUpEvent, new MouseButtonEventHandler(this.OnStopDrag));
            TranslateTransform Translate = this.AssociatedObject.RenderTransform as TranslateTransform;
            Translate.X = (Mouse.GetPosition(this.AssociatedObject.Parent as FrameworkElement).X - this.MouseDownPosition.X) / 3;
            Translate.Y = (Mouse.GetPosition(this.AssociatedObject.Parent as FrameworkElement).Y - this.MouseDownPosition.Y) / 3;

            Point Position = new Point(Translate.X,Translate.Y);
            Size Size = this.AssociatedObject.DesiredSize;
            Rect Bounds = new Rect(Position,Size);

            this.AssociatedObject.Arrange(this.AssociatedObject.RenderTransform.TransformBounds(Bounds));
        }
    }
    private void OnStopDrag(object sender, MouseButtonEventArgs e)
    {
        if (this.AssociatedObject.IsMouseCaptured)
        {
            this.AssociatedObject.ReleaseMouseCapture();
            this.AssociatedObject.RemoveHandler(FrameworkElement.MouseMoveEvent, new MouseEventHandler(this.OnDrag));
            this.AssociatedObject.RemoveHandler(FrameworkElement.MouseLeftButtonUpEvent, new MouseButtonEventHandler(this.OnStopDrag));
        }
    }
  

我希望这可以帮助每个人/将会遇到这个奇怪的问题,解决或深入了解WPF布局过程以找到MS可能存在的任何错误/未知默认值。   我想我还不知道WPF布局这个巨大的争论。   目前,我只假设在Identity和翻译矩阵之间的Matrix产品中存在一些标量值,可能会影响容器布局过程中Basis的变化,但它只是一个代数考虑因素,在MS实现中没有任何证据。   请大家详细解释我们如何正确使用TranslateTransform,而不依赖于Panel所有者。   非常感谢大家!   等待回复,考虑因素,我的代码的解释。