首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RenderTransform Mouse.GetPosition

RenderTransform Mouse.GetPosition
EN

Stack Overflow用户
提问于 2011-11-12 14:16:29
回答 2查看 1.7K关注 0票数 0

好的,最好使用一些修正,只适用于X坐标:给定以下代码:

代码语言:javascript
复制
    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)我将对象拖到任意位置。在我的小组里有100分。

3.(MouseLeftButtonUp)对象被正确地定位在我让IT拖放的地方。

直到现在,当我第二次启动事件链时,还没有problems.But:

1.(MouseLeftButtonDown)拖动的对象移回:

代码语言:javascript
复制
                         CurrentPointerPosition + FIRSTPosition

执行

  1. (MouseMove)Drag移动,但MousePointer位于拖动对象的CurrentPointerPosition + FIRSTPosition处。

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2011-11-13 15:36:28

多亏了MSDN上的"TheKiller556“,我终于找到了正确的方法来解决问题,根据布局的变化,所以做出了真正的通用和健壮的拖动行为。

没有解决RenderTransforms问题的链接,似乎也在复杂的逻辑面板上解决了边缘属性(测试):

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

我希望,在未来,将有一个更深刻的解释,改造问题无论如何。感谢大家!(我知道我自己不能投票,但如果有人深入我的职位,我就能有效地找到解决办法,所以,如果可能的话,我想知道我是否能得到一些观点。)再次感谢你!

票数 2
EN

Stack Overflow用户

发布于 2011-11-12 23:16:37

好吧,挖了几个小时后,我终于找到了解决办法。我恳请每一个在WPF/Silverlight方面有经验的人都能解释我(以及其他有这个问题的人)为什么我的代码能准确地工作,因为我真的找不到合理的理由:

代码语言:javascript
复制
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布局过程中去找出任何可能的bug/未知的缺省值,我想我还不知道这个巨大的论点,也就是WPF布局。目前,我只认为矩阵乘积在恒等式和翻译矩阵之间有一定的标量值,可能会影响容器布局过程中基的变化,但这只是一个代数考虑,在MS实现中没有任何证明。请向每个人解释我们如何正确地使用TranslateTransform,而不依赖于面板所有者。非常感谢大家!等待我的代码的答复、注意事项和解释。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8104975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档