Ich habe eine ListView , in der ich die Zeichnung optimieren möchte von Elementen (zum Beispiel das Hervorheben bestimmter Strings in Listenansichts-Items), jedoch möchte ich die Art und Weise, wie Elemente angezeigt werden, nicht radikal ändern.
Ich habe OwnerDraw auf true gesetzt und kann Wenn ich versuche, die Standardimplementierung zu verschieben, um den Rest der Listenansicht zu zeichnen, gehen die Dinge schief und ich habe eine Menge grafischer Probleme, die darauf hindeuten, dass Ich bin komplett falsch gelaufen.
Gibt es irgendwo, dass ich sehen kann, was die "Standard" Handler für die DrawItem
und DrawSubItem
Ereignisse, damit ich mein Verständnis verbessern und meinen Code leichter verändern kann?
Als Referenz hier ist ein Ausschnitt, der zeigt, was ich gerade mache:
%Vor%Ich habe jetzt nicht die Zeit, eine vollständige Antwort zu schreiben, stattdessen werde ich ein paar kurze Notizen machen und später darauf zurückkommen.
Wie LarsTech sagte, ist das Zeichnen eines Controllers ListView
ein Problem - die Klasse .Net ListView
ist ein Wrapper um das zugrunde liegende Win32 List View Control und die Fähigkeit zu" Owner Draw "wird von der NM_CUSTOMDRAW
Benachrichtigungscode . Daher gibt es keine ".Net-Standardimplementierung" - standardmäßig wird das zugrunde liegende Win32-Steuerelement verwendet.
Um das Leben noch schwieriger zu machen, müssen einige zusätzliche Überlegungen angestellt werden:
DrawItem
und DrawSubItem
behandeln, zeichnen Sie möglicherweise den Inhalt der ersten Zelle zweimal. DrawItem
-Ereignis ohne entsprechende DrawSubItem
-Ereignisse auftritt, was bedeutet, dass wenn Sie einen Hintergrund im DrawItem
-Ereignis zeichnen und dann den Text in DrawSubItem
zeichnen Event wird Ihr Artikeltext verschwinden, wenn Sie mit der Maus darüber fahren. ItemState
nicht zutrifft immer korrekt, zum Beispiel direkt nach der Größenänderung einer Spalte. Folglich habe ich sein Bestes gefunden, mich nicht darauf zu verlassen. DrawItem
-Ereignis zuerst auftritt, kann alles, was Sie im DrawItem
-Handler zeichnen (z. B. der Selektionseffekt), möglicherweise von Dingen überlagert werden, die Sie im DrawSubItem
-Handler machen (z. B. bestimmte Zellen mit einem anderen Hintergrund) Farbe). Alles in allem ist die Handhabung der Eigentümerzeichnung eine ziemlich komplizierte Angelegenheit - ich fand es am besten, die all Zeichnung im DrawSubItem
-Ereignis zu handhaben, es ist auch am besten, Ihre eigene Doppelpufferung mit Hilfe der BufferedGraphics
Klasse.
Ich fand auch, dass ich den Quellcode für ObjectListView sehr praktisch finde.
Letztendlich dient all dies nur dazu, den Detailmodus der Listenansicht zu handhaben (der einzige Modus, den ich benutze), wenn Sie möchten, dass die anderen Modi auch funktionieren, dann glaube ich, dass es noch zusätzliche Dinge zu berücksichtigen gibt.
Wenn ich eine Chance bekomme, werde ich versuchen, meinen Arbeitsbeispiel-Code zu veröffentlichen.
Ich weiß nicht, ob dir das vollständig helfen wird, aber ich füge ein paar Anmerkungen hinzu:
Beachten Sie, dass DrawSubItem
auch das erste Element zeichnet, und das ist wahrscheinlich der Ort, von dem Sie den double-rendered
-Look erhalten.
Einige Dinge zu versuchen (nicht für die Geschwindigkeit berücksichtigt):
%Vor% Stellen Sie für Ihre DrawSubItem-Routine sicher, dass Sie nicht in die erste Spalte zeichnen und die DrawBackground()
-Routine hinzugefügt haben. Ich fügte dem Highlight-Rechteck etwas Ausschnitt hinzu, damit es nicht außerhalb der Spaltenparameter malte.
Im Allgemeinen begrüßt der Besitzer, der ein ListView-Steuerelement zeichnet, in einer Welt voller Verletzungen. Sie zeichnen keine visuellen Stile mehr, Sie müssten das auch selbst tun. Ugh.
Die ausgewählte Hintergrundfarbe wurde geändert. Standardmäßig blau in Windows. Dieser Code wird dir in allen Farben helfen:
%Vor%ComponentOwl hat kürzlich eine Freeware-Komponente namens Better ListView Express veröffentlicht.
Es sieht aus und verhält sich genau wie der ListView, hat aber einen viel mächtigeren Besitzer Zeichnen Fähigkeiten - Sie können genau über alle Elemente zeichnen und sogar einige Zeichnungen abstellen (zB Auswahl, um Sie anzumachen).
Tags und Links c# winforms listview virtualmode