2012-07-26 4 views
0

Je développe actuellement une application C#. En ce moment j'essaye de réaliser un glisseur simple:Simple panneau-curseur en C#

|--------------------------| 
|       | 
| |--------------------| | 
| |     | | 
| |  Panel1  | | 
| |  Panel2  | | 
| |     | | 
| |--------------------| | 
|   x x x   | 
|--------------------------| 

J'ai deux panneaux avec exactement la même taille. Panel1 est juste nécessaire pour afficher une bordure et définir les limites pour panel2 qui est ensuite dynamiquement échangé. Si le second x est cliqué, le panneau 2 devrait se déplacer vers la gauche et le panneau3 devrait venir de la droite et également se déplacer vers la gauche.

Fondamentalement, j'ai le code suivant:

Panel panel2 = panelArray[0]; 
Panel panel3 = panelArray[1]; 

Le code suivant doit maintenant effectuer la diapositive:

for (int i = 0; i <= 100; i++) 
{ 
    panel2.Location = new Point(panel2.Location.X - i, panel2.Location.Y); 
    System.Threading.Thread.Sleep(10); 
} 

for (int i = 0; i <= 100; i++) 
{ 
    panel3.Location = new Point(100 - i, panel3.Location.Y); 
    System.Threading.Thread.Sleep(10); 
} 

D'une certaine façon le premier panneau est coulissé-parfaitement, mais panel2 ne glisse. C'est juste affiché après l'exécution de la boucle.

Une idée de pourquoi panel2 n'effectue pas la diapositive? J'utilise WinForms.

Répondre

1

Essayez d'ajouter Application.DoEvents dans le corps de votre boucle après le changement d'emplacement. L'interface utilisateur a besoin d'une chance de rattraper son retard.

0

Le problème est que vous ne permettez pas à la pompe de messages de s'exécuter en forçant un sommeil. Le Application.DoEvents suggéré déclenche la pompe de message, mais ce n'est pas une bonne solution car votre code bloque toujours la plupart du temps et vous pouvez même exécuter des boucles infinies avec ce modèle (par exemple, si DoEvents rentre dans l'événement que vous appelez de). Au lieu d'utiliser Thread.Sleep, vous devriez utiliser un (Winforms) Timer au lieu d'utiliser . Cela résoudra le problème de mise à jour de l'interface utilisateur et maintiendra également l'interface utilisateur en vie pendant que le curseur se déplace.

+0

Merci pour votre réponse, mais comment puis-je utiliser 'Timer' dans une boucle? Je veux dire que je dois en quelque sorte mettre en pause la boucle pour produire une diapositive lisse ... Peut-être que vous pourriez ajouter un court code coupé? Merci beaucoup! – libjup

+0

La minuterie remplace la boucle - à chaque événement de minuterie vous déplacez d'un pas et quittez. La minuterie sera déclenchée par l'intervalle que vous spécifiez, vous donnant un mouvement à peu près aussi fluide qu'avec le délai que vous faites manuellement maintenant. – Lucero

+0

Btw Application.DoEvents fonctionne bien;) il ne reste plus qu'un problème: le panneau a une taille de 800px; si je déplace panel2 je dois seulement le déplacer 100px vers la gauche. Mais si je laisse glisser panel3, il y a 800px à déplacer. Comment puis-je m'assurer que les deux diapositives sont faites à la même vitesse? J'ai déjà défini 'System.Threading.Thread.Sleep (1);' sur 1 mais il est toujours légèrement plus lent que le premier ... – libjup