2013-01-03 1 views
0

J'ai un panneau, qui peut être déplacé vers la gauche ou la droite (choisi automatiquement en fonction de sa position actuelle, la distance est statique) par cliquez sur. En outre, l'utilisateur peut faire glisser le panneau verticalement comme il le souhaite en cliquant sur le panneau, en maintenant le bouton et en déplaçant sa souris. Le problème est que le panneau fait aussi le déplacement gauche/droite, quand il est déposé après avoir été déplacé verticalement, de sorte que l'utilisateur doit cliquer à nouveau dessus ensuite, pour obtenir le bon côté (gauche/droite). Voici les méthodes que je utilise: Ajout eventhandlers à panneau (appelé Strip ici)Vérifier si le panneau a bougé pendant MouseDown

Strip.MouseDown += new MouseEventHandler(button_MouseDown); 
Strip.MouseMove += new MouseEventHandler(button_MouseMove); 
Strip.MouseUp += new MouseEventHandler(button_MouseUp); 
Strip.Click += new EventHandler(strip_Click); 

Et ici toutes les méthodes mentionnées ci-dessus:

void button_MouseDown(object sender, MouseEventArgs e) 
    { 
     activeControl = sender as Control; 
     previousLocation = e.Location; 
     Cursor = Cursors.Hand; 
    } 

void button_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (activeControl == null || activeControl != sender) 
      return; 

     var location = activeControl.Location; 
     location.Offset(0, e.Location.Y - previousLocation.Y); 
     activeControl.Location = location; 
    } 

void button_MouseUp(object sender, MouseEventArgs e) 
    { 
     activeControl = null; 
     Cursor = Cursors.Default; 
    } 

void strip_Click(object sender, EventArgs e) // The one moving strip to left or right 
    { 
     activeControl = sender as Control; 
      if (activeControl.Left != 30) 
       activeControl.Left = 30; 
      else 
       activeControl.Left = 5; 
    } 

Comment faire le panneau ne se déplacer à gauche ou à droite quand il a été déplacé verticalement?

+0

Qu'est-ce ta question? – MyCodeSucks

+0

Comment faire pour que le panneau ne bouge pas à gauche ou à droite lorsqu'il est déplacé verticalement. –

+0

@HansPassant Essayé de remplacer 0 par 1, dès que je clique sur le panneau, il commence à se déplacer vers la droite. Il s'arrête quand je relâche le bouton de la souris, mais je ne peux pas le récupérer quand même. J'ai juste besoin de quelque chose comme "si location.y a changé -> garder la location.x la même chose (donc n'appliquez pas le strip_click) –

Répondre

2

Vous devrez faire la distinction entre un clic et un glisser. Donc, ajoutez un champ privé nommé "dragged".

private bool dragged; 

Dans le gestionnaire d'événements MouseDown ajouter:

dragged = false; 

Dans le gestionnaire d'événements MouseMove ajouter:

if (Math.Abs(location.Y - previousLocation.Y) > 
     SystemInformation.DoubleClickSize.Height) dragged = true; 

Dans le gestionnaire d'événements, cliquez sur Ajouter:

if (dragged) return; 
+0

Étrange, maintenant je ne peux pas bouger le panneau du tout.Peut-être son pour cette raison: comme il n'y a plus de panneaux avec cette chose appliquée, je sauve le "dragged" comme étiquette invisible dans chacun d'entre eux, mettre à la chaîne "0", changeant en "1" quand dans le "si" dans MouseMove, et de nouveau à "0" dans MouseDown. Quand je clique sur le panneau, il bouge encore tout à fait à gauche ou à droite, mais je ne peux pas le déplacer verticalement maintenant –

+0

J'ai juste compris que ce que j'ai fait est un non-sens total, désolé, maintenant appliqué votre code avec bool variable, mais j'obtiens le même résultat - après avoir appuyé sur le bouton de la souris et bougé la souris, la bande ne bouge pas ** MAIS **, quand je bouge la souris au moins ça ne bouge pas horizontalement :) –

+1

juste des instructions insérées, elles n'empêchent pas l'affectation à la propriété Location dans le Mou événement seMove. C'est ce qui fait bouger le panneau. Je ne peux pas deviner comment vous vous êtes trompé. –

Questions connexes