Comment puis-je régler le protégé DoubleBuffered propriété des contrôles sur un formulaire qui souffrent de scintillement?
Réponses
Trop de publicités?Ici est une version générique de Mannequin de la solution.
Nous pouvons utiliser la réflexion pour arriver à la protégée DoubleBuffered de la propriété, et alors il peut être défini à true.
Remarque: Vous devez payer votre développeur de les impôts et de ne pas utiliser le double-buffering si l'utilisateur exécute dans une session des services terminal server (par exemple, Bureau à Distance) Cette méthode d'assistance ne s'allume pas double mise en mémoire tampon si la personne est en cours d'exécution dans le bureau à distance.
public static void SetDoubleBuffered(System.Windows.Forms.Control c)
{
//Taxes: Remote Desktop Connection and painting
//http://blogs.msdn.com/oldnewthing/archive/2006/01/03/508694.aspx
if (System.Windows.Forms.SystemInformation.TerminalServerSession)
return;
System.Reflection.PropertyInfo aProp =
typeof(System.Windows.Forms.Control).GetProperty(
"DoubleBuffered",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
aProp.SetValue(c, true, null);
}
Vérifiez ce fil
Répéter la base de cette réponse, vous pouvez activer la WS_EX_COMPOSITED style drapeau sur la fenêtre pour obtenir à la fois la forme et l'ensemble de ses commandes à double tampon. Le style drapeau est disponible depuis XP. Il ne veut pas faire de la peinture est plus rapide, mais l'ensemble de la fenêtre est établi dans une mémoire tampon d'écran et blitted à l'écran en un seul coup. De se faire un instant les yeux de l'utilisateur, sans visible de la peinture des artefacts. Il n'est pas entièrement sans problème, certains styles visuels convertisseurs peuvent glitch sur elle, en particulier TabControl lorsque ses a trop d'onglets. YMMV.
Collez ce code dans votre formulaire de classe:
protected override CreateParams CreateParams {
get {
var cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
La grande différence entre cette technique et Winform du double-buffering soutien est que Winform version ne fonctionne que sur une seule commande à la fois. Vous verrez tout de chaque contrôle de la peinture elle-même. Ce qui peut ressembler à un effet de scintillement, surtout si la non peinte de contrôle rectangle contraste mal avec la fenêtre de l'arrière-plan.
System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control)
.GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
aProp.SetValue(ListView1, true, null);
Ian a certains plus d'informations sur l'utilisation de ce sur un serveur terminal server.