2010-08-12 52 views
1

我需要用鼠标光标移动多个文本框。 我决定我这样做。 如果单击文本框(并按下“控制”按钮),则将文本框添加到所选项目的列表中。然后,当按钮仍然按下,当鼠标移动时,我执行移动控件的操作。但是,我的代码不能正常工作。文本框正在移动,但速度非常快。这里是我的代码移动多个控件

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

问题是,你总是会计算出初始起点的增量。您必须在每次致电txtBox_ PreviewMouseMove后实施startPoint。 Somethin like ...

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

} 

...应该做的工作。我所看到的另一件事是,方向可能倒过来。这可以很容易地纠正。改变calculcation ...

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

...这个问题也应该消失。

+0

非常感谢:)它的工作原理 – Berial 2010-08-12 19:19:56