2016-09-27 15 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 для всех элементов. Вместо этого вы должны создать новый экземпляр для каждого элемента, либо при создании элемента, либо, например, в обработчике 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; 
    } 
} 
+0

Большого спасибо за вашу помощь. Я полностью забываю, что я использую один объект преобразования для каждого объекта. –

 Смежные вопросы

  • Нет связанных вопросов^_^