J'utilise le contrôle ListView avec les paramètres suivants sont définis:vacillant dans listview avec OwnerDraw et VirtualMode
this.listView1.BackColor = System.Drawing.Color.Gainsboro;
this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1,
this.columnHeader2});
this.listView1.FullRowSelect = true;
this.listView1.HideSelection = false;
this.listView1.Location = new System.Drawing.Point(67, 192);
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(438, 236);
this.listView1.TabIndex = 0;
this.listView1.UseCompatibleStateImageBehavior = false;
this.listView1.View = System.Windows.Forms.View.Details;
this.listView1.DrawColumnHeader += new System.Windows.Forms.DrawListViewColumnHeaderEventHandler(this.listView1_DrawColumnHeader);
this.listView1.RetrieveVirtualItem += new System.Windows.Forms.RetrieveVirtualItemEventHandler(this.listView1_RetrieveVirtualItem);
this.listView1.DrawSubItem += new System.Windows.Forms.DrawListViewSubItemEventHandler(this.listView1_DrawSubItem);
Deux lignes sont fournis avec un texte aléatoire. Ownerdrawing est simple:
private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
if (e.ColumnIndex == 0)
{
e.DrawBackground();
e.DrawText();
}
else
e.DrawDefault = true;
//Console.WriteLine("{0}\t\tBounds:{1}\tItem:{2}\tSubitem:{3}", (i++).ToString(), e.Bounds.ToString(), e.Item, e.SubItem);
}
le problème est le suivant: quand je souris sur planer le contenu de listview, je reçois vacillante de la première colonne. Le débogage montre que DrawSubItem est appelé en permanence lorsque la souris le survole.
Est-ce bug? Comment éviter ce comportement?
Ceci est une vieille question, mais la réponse accceptée n'est pas correcte, ou du moins pas à partir de .NET 4.0. Vérifiez l'attribut protégé DoubleBuffered de la classe ListView, et éventuellement ma réponse à [this] (http: // stackoverflow.com/questions/10484265/question flickering-in-listview-control-ownerdraw-virtual/10501938 # 10501938). – zmilojko
La réponse donnée est complètement correcte. Sur XP, si vous avez une liste virtuelle et survolez la colonne 0, le contrôle clignotera. DoubleBuffered = true ne fait aucune différence. Il est vrai que sur Windows 7, ce problème ne se produit pas, mais cela ne rend pas cette réponse incorrecte. – Grammarian