Comment réparer les problèmes de scintillement des contrôles winform imbriqués
Je suis actuellement en train de travailler sur un programme qui utilise une structure assez complexe de imbriquée winform contrôles qui change dynamiquement en tant qu'utilisateur effectue un certain nombre de sélections. Pour aller plus dans les détails au sujet de la disposition spécifique des contrôles pourrait être étendue pour cette question.
Quand une sélection est faite, beaucoup de mises à jour sont faites pour le modèle sous-jacent qui est contrôlé par les commandes de l'utilisateur. Cela entraîne ensuite une série de changements correspondants dans la taille/position/visibilité des commandes affichées. Tous ces changements ont des résultats dans un douloureusement intense scintillement de commandes sur l'écran. J'ai besoin de quelque sorte résoudre ce problème de manière que chaque fois que l'utilisateur effectue une sélection l'écran est fondamentalement gelé jusqu'à ce que le contrôle de la fin des mises à jour.
J'ai tenté d'utiliser le Contrôle.SuspendLayout/De Contrôle.ResumeLayout méthodes dans de nombreux endroits différents et des façons et je ne peux pas éliminer le fou de scintillement. Je pensais que la suspension de la disposition sur la racine de contrôle lors des changements de corriger le problème, mais il semble que ce SuspendLayout n'aide pas l'enfant que les contrôles soient modifiés.
Dois-je utiliser une autre approche, plutôt que de SuspendLayout? Est il possible que je peux debug SuspendLayout de voir pourquoi il ne semble pas être en cascade à tous les contrôles enfants?
source d'informationauteur TJ_Fischer
Vous devez vous connecter pour publier un commentaire.
Suspendre/ResumeLayout n'est pas votre problème ici. Que seulement suspend la mise en page automatique, le type qui est déclenché par l'Ancrage et le Quai des propriétés. Double-tampon ne peut pas résoudre votre problème, qui supprime le scintillement de chaque contrôle. Votre vrai problème, c'est que vous êtes la mise à jour de trop nombreux contrôles dans le même temps, chacun va prendre son tour à la peinture elle-même et qui prend du temps.
Ce que vous avez besoin est d'un genre différent de double-buffering, de la composition. Vérifier si la solution ce fil de résoudre votre problème.
En plus de @tommieb75 de la suggestion pour la double mise en mémoire tampon, vous pouvez essayer et voir si votre niveau de la racine des contrôles ont
BeginUpdate/EndUpdate
méthode des paires. Ceux-ci devraient aider à réprimer le repeint entre les appels.Si vous utilisez WinForms 2+, alors vous pouvez simplement régler le Contrôle.DoubleBuffer' propriété sur le contrôle de vrai (dans le concepteur de même).
Avec cadre 2, configuration de DoubleBuffered ensembles les 3 drapeaux : OptimizedDoubleBuffer, AllPaintingInWmPaint, et et un autre que j'ai oublié, 'UserPaint' peut-être.
Aussi, regarde-le BeginUpdate/EndUpdate comme mentionné par @yetapb.
Utiliser le
SetControlStyles
dans le Contrôle de l'utilisateur, le drapeau estOptimizedDoubleBuffer
qui permettra d'éviter le scintillement.