2010-06-18 5 views
4

J'ai un formulaire qui contient beaucoup de contrôles générés à l'exécution (image, bouton, panneau, ...), environ 100 contrôles (je fais un jeu de cartes correspondant donc il y a beaucoup de contrôles dans le formulaire).Empêche les commandes d'être redessinées en C#?

Je place le code de génération dans le constructeur et chaque fois que l'application démarre, il a fallu environ 3 à 5 secondes pour charger complètement toutes les commandes.

Si j'apporte une autre fenêtre sur le dessus, puis de nouveau à mon application, les contrôles seront redessinés à nouveau.

Comment puis-je empêcher le redessin des commandes? Si cela ne vous dérange pas, donnez-moi un exemple simple en C#.

Toute aide est appréciée!

+3

Avoir 100 contrôles sur la page est une odeur de conception. Dommage que les utilisateurs pauvres doivent naviguer dans cette interface! –

Répondre

1

J'ai trouvé cet article qui explique comment faire cela dans .NET en appelant le WIN API SET_MESSAGE function pour définir l'indicateur WM_SETREDRAW pour le contrôle que vous ne voulez pas mettre à jour. Bien que vous puissiez arrêter la mise à jour de certains contrôles, êtes-vous sûr de ne pas pouvoir résoudre ce problème en réduisant le nombre de contrôles sur la page? 100 Contrôles semble beaucoup et peut être une indication que vous devez avoir plusieurs vues.

Profitez-en!

+0

Merci pour votre réponse rapide, mais le problème est toujours là. Honnêtement, je fais un jeu de cartes correspondant donc il y a beaucoup de contrôles dans le formulaire (chaque carte est un panneau avec une image à l'intérieur). Pourriez-vous me proposer une solution? – ByulTaeng

+0

Ma suggestion serait similaire à la suggestion de James Westgate d'utiliser un objet graphique pour dessiner vos cartes à l'écran. Il pourrait y avoir un certain avantage à lire sur ce modèle ainsi http: //en.wikipedia.org/wiki/Flyweight_pattern – Doug

0

Vous pouvez envisager d'utiliser un seul contrôle de table de données. Un ListView (ou quelque chose comme ObjectListView) peut être une bonne option.

Si vos données ne sont pas vraiment une liste/table, vous devez scinder les contrôles en pages à onglet séparées, ce qui améliorerait à la fois les performances et la convivialité.

+0

Merci pour votre réponse ^^ – ByulTaeng

1

Ma suggestion est d'utiliser le formulaire comme surface de dessin et de dessiner vos cartes bitmap directement sur le formulaire. Ce n'est pas difficile à faire.

Vous pouvez ajouter un gestionnaire à l'événement Paint qui vous donnera des paramètres avec un objet Graphics. Utilisez graphics.DrawImageUnscaled pour dessiner chaque carte à l'endroit que vous voulez.

Cela rendra l'application beaucoup plus rapide.

+0

Merci pour votre réponse, mais si j'utilise l'objet Graphics pour dessiner la carte, comment puis-je simuler l'effet hover? – ByulTaeng

+0

Gardez une trace de la souris qui vous dira si vous êtes sur ou cliquez sur une carte, puis appelez à nouveau votre code de peinture pour dessiner toutes les cartes, y compris la carte hover. –

1

Empêcher un contrôle de redessiner est assez inutile. Vous obtiendrez un trou où un contrôle devait apparaître, votre utilisateur n'aura aucune utilité pour ce trou.

Il se redessine lentement simplement parce que vous avez trop de contrôles. Vous pouvez seulement l'obtenir pour le redessiner plus rapidement en utilisant moins de contrôles. Ou en utilisant des contrôles qui peuvent afficher plusieurs éléments dans une fenêtre, comme ListBox, ListView, TreeView, DataGridView.

Notez que votre problème spécifique est résolu dans Vista et Windows 7. Le thème Aero utilise la mise en mémoire tampon pour les fenêtres. Ce qui signifie que les fenêtres n'ont plus besoin de se repeindre lorsqu'elles sont obscurcies par une autre fenêtre. Cependant, vous obtiendrez toujours des retraits lents lorsque l'utilisateur réduit la fenêtre et la restaure.

Questions connexes