2010-08-12 6 views
1

Je dois déplacer plusieurs zones de texte avec un curseur de souris. J'ai décidé de faire comme ça. Si vous cliquez sur une zone de texte (et que vous appuyez sur le bouton Contrôle), une zone de texte est ajoutée à la liste des éléments sélectionnés. Ensuite, quand le bouton est encore pressé et que la souris bouge, je fais une opération de déplacement des contrôles. Cependant, mon code ne fonctionne pas bien. Les boîtes de texte sont en mouvement mais très très rapidement. Voici mon codedéplacement de plusieurs contrôles

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

    } 

Fondamentalement, je parcoure tous les éléments sélectionnés et change leur position sur le canevas. Cependant, je calcule probablement une nouvelle position de manière incorrecte.

Répondre

1

Le problème est que vous calculez toujours le delta au point de départ initial. Vous devez actualiser startPoint après chaque appel à txtBox_ PreviewMouseMove. Quelque chose comme ...

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

} 

... devrait faire le travail. Une autre chose que j'ai vue, c'est que la direction est probablement inversée. Cela peut être facilement corrigé. Changez le calculcation à ...

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

... et ce problème devrait également disparaître.

+0

Merci beaucoup :) Ça marche – Berial

Questions connexes