2016-09-27 28 views
0

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

我编写的程序对于屏幕上的One对象来说是完美的,我可以通过拖动它来移动到任何想要的位置。但是,当物体的数量增加时,它会造成一个非常奇怪的问题。当我点击任何对象时,它会创建窗口上所有对象的集群,并开始将转换应用于整个集群。

注:所有的对象是图片和容器是帆布

下面是我使用的一些图像和代码。

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; 
    } 

这是单个物体,我可以将它移动到任何我想要的地方而不会有任何混乱。 enter image description here

这里我有三个对象。当我点击他们中的任何一个时,他们会创建一个群集并开始一起移动 enter image description here

回答

1

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

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; 
    } 
} 
+0

非常感谢您的帮助。我完全忘记了我对每个对象使用相同的变换对象。 –

相关问题