【问题标题】:WFP TranslateTransform Error粮食计划署翻译转换错误
【发布时间】:2016-09-27 05:22:24
【问题描述】:

我正在做一个绘图项目。我没有在其中创建一个可拖动的窗口,用户可以在其中单击任何对象并将其移动到不同的位置,就像我们在 PhotoShop 中使用我们的图层所做的那样。

我编写的程序非常适合屏幕上的 One 对象,我可以通过简单地拖动它来移动到我想要的任何位置。但是当对象的数量增加时,就会导致一个非常奇怪的问题。当我单击任何对象时,它会在窗口上创建一个包含所有对象的集群,并开始将转换应用于整个集群。

注意:所有对象都是Images,Container是Canvas

这是我正在使用的一些图像和代码。

    private Point _currentPoint;
    private Point _ancherPoint;
    private bool _isInDrag = false;
    private TranslateTransform _transform = new TranslateTransform();
    private Image _element;
    private void DropList_MouseLeftButtonDown( object sender, MouseButtonEventArgs e )
    {
        _element = FindAnchestor<Image>( ( DependencyObject )e.OriginalSource );

        if( _element != null )
        {
            _ancherPoint = e.GetPosition( DropList );
            _isInDrag = true;
            _element.CaptureMouse();
            e.Handled = true;

        }
    }

    private void DropList_MouseMove( object sender, MouseEventArgs e )
    {
        if( _isInDrag )
        {
            _currentPoint = e.GetPosition( DropList );


            _transform.X += ( _currentPoint.X - _ancherPoint.X );
            _transform.Y += ( _currentPoint.Y - _ancherPoint.Y );

            Lbl.Content = _element.Source.ToString();

             Source on which transfrom is going to happen
            _element.RenderTransform = _transform;
            _ancherPoint = _currentPoint;
        }
    }
    private void DropList_MouseLeftButtonUp( object sender, MouseButtonEventArgs e )
    {
        if( _isInDrag )
        {
            _element.ReleaseMouseCapture();
            _isInDrag = false;
            e.Handled = true;
        }
    }

    private static T FindAnchestor<T>( DependencyObject current ) where T : DependencyObject
    {
        do
        {
            if( current is T )
            {
                return ( T )current;
            }
            current = VisualTreeHelper.GetParent( current );
        }
        while( current != null );
        return null;
    }

这是单个对象,我可以轻松地将其移动到我想要的任何地方,而不会造成任何混乱。

这里我有三个对象。当我单击其中任何一个时,它们会形成一个集群并开始一起移动。

【问题讨论】:

    标签: wpf drag-and-drop wpf-controls draggable mousemove


    【解决方案1】:

    问题是您对所有元素使用相同的TranslateTransform 实例。相反,您应该为每个元素创建一个新实例,无论是在创建元素时,还是例如在 MouseDown 处理程序中:

    private void DropList_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        _element = FindAnchestor<Image>((DependencyObject)e.OriginalSource);
    
        if (_element != null)
        {
            var point = e.GetPosition((IInputElement)sender);
            _isInDrag = true;
            _element.CaptureMouse();
            _element.RenderTransform = new TranslateTransform(point.X, point.Y); // here
            e.Handled = true;
        }
    }
    

    并在移动时使用它:

    private void DropList_MouseMove(object sender, MouseEventArgs e)
    {
        if (_isInDrag)
        {
            var point = e.GetPosition((IInputElement)sender);
            var transform = (TranslateTransform)_element.RenderTransform;
            transform.X = point.X;
            transform.Y = point.Y;
        }
    }
    

    【讨论】:

    • 非常感谢您的帮助。我完全忘记了我对每个对象都使用相同的变换对象。
    猜你喜欢
    • 2020-10-14
    • 1970-01-01
    • 2018-09-20
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2015-05-03
    • 1970-01-01
    相关资源
    最近更新 更多