перемещение нескольких элементов управления - PullRequest
1 голос
/ 12 августа 2010

Мне нужно переместить несколько текстовых полей с помощью курсора мыши. Я решил, что так и сделаю. Если щелкнуть текстовое поле (и нажать кнопку «Управление»), текстовое поле добавляется в список выбранных элементов. Затем, когда кнопка все еще нажата, а когда мышь двигается, я выполняю операцию перемещения элементов управления. Однако мой код не работает хорошо. Текстовые поля движутся, но очень, очень быстро. Вот мой код

 List<TextBox> items;
 private void txtBox_PreviewMouseDown(object sender, RoutedEventArgs e)
    {


            isClicked = true;
            startPoint = Mouse.GetPosition(  (sender as TextBox).Parent);
            items = CurrentSelection;




    }
private void txtBox_PreviewMouseMove(object sender, RoutedEventArgs e)
    {


        Point mousePos = Mouse.GetPosition(parentCanvas);
         if (isClicked)
         {
             foreach (TextBox item in items)
             {
                 double left = Canvas.GetLeft(item);
                 double top = Canvas.GetTop(item);

                 Canvas.SetLeft(item, left + (startPoint.X - mousePos.X));
                 Canvas.SetTop(item, top + (startPoint.Y - mousePos.Y));
             }
         }

    }

В основном я перебираю все выбранные элементы и меняю их положение на холсте. Однако я, вероятно, неправильно рассчитал новую позицию.

1 Ответ

1 голос
/ 12 августа 2010

Проблема в том, что вы всегда вычисляете дельту до начальной начальной точки. Вы должны актуализировать startPoint после каждого вызова txtBox_ PreviewMouseMove. Что-то вроде ...

private void txtBox_PreviewMouseMove(object sender, RoutedEventArgs e) {  
    Point mousePos = Mouse.GetPosition(parentCanvas); 
     if (isClicked){ 
         foreach (TextBox item in items) { 
             double left = Canvas.GetLeft(item); 
             double top = Canvas.GetTop(item); 

             Canvas.SetLeft(item, left + (startPoint.X - mousePos.X)); 
             Canvas.SetTop(item, top + (startPoint.Y - mousePos.Y)); 
         } 
         startPoint=mousePoint;
     } 

} 

... должен сделать работу. Еще одна вещь, которую я видел, это то, что направление, вероятно, перевернуто. Это можно легко исправить. Изменить калькуляцию на ...

Canvas.SetLeft(item, left + (mousePos.X-startPoint.X ));  
Canvas.SetTop(item, top + (mousePos.Y-startPoint.Y));  

... и эта проблема также должна исчезнуть.

...