首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WFP TranslateTransform错误

WFP TranslateTransform错误
EN

Stack Overflow用户
提问于 2016-09-27 05:22:24
回答 1查看 44关注 0票数 0

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

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

注释:所有对象都是图像,容器是画布

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

代码语言:javascript
复制
    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;
    }

这是一个单一的物体,我可以把它移动到任何我想要的地方,不需要任何混乱。

这里有三个物体。当我点击它们中的任何一个时,它们就会形成一个集群,并开始一起移动。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-27 05:55:42

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

代码语言:javascript
复制
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;
    }
}

并在移动时使用:

代码语言:javascript
复制
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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39716549

复制
相关文章

相似问题

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