2010-02-26 19 views
10

Ich arbeite derzeit an einem Programm, das eine ziemlich komplexe Struktur der verschachtelten Winform-Steuerelemente verwendet, die dynamisch ändert, wie ein Benutzer bestimmte Auswahlen trifft. Um detaillierter auf das spezifische Layout der Steuerelemente einzugehen, wäre für diese Frage zu umfangreich.Wie verschachtelte Winform-Steuerelement Flicker Probleme beheben

Wenn eine Auswahl getroffen wird, werden viele Aktualisierungen am zugrunde liegenden Modell vorgenommen, das von den Benutzersteuerelementen gesteuert wird. Dies führt dann zu einer Reihe von entsprechenden Änderungen in der Größe/Position/Sichtbarkeit der angezeigten Steuerelemente. All diese Änderungen führen zu einem schmerzhaft intensiven Flackern der Steuerelemente auf dem Bildschirm. Ich muss das irgendwie beheben, so dass der Bildschirm jedes Mal, wenn der Benutzer eine Auswahl trifft, grundsätzlich eingefroren wird, bis alle Steuerungsaktualisierungen abgeschlossen sind.

Ich habe versucht, die Control.SuspendLayout/Control.ResumeLayout Methoden an vielen verschiedenen Orten und Wegen zu verwenden, und ich kann das verrückte Flackern nicht beseitigen. Ich dachte, dass das Aussetzen des Layouts auf dem Stammsteuerelement während der Änderungen das Problem beheben würde, aber es scheint, dass dieses SuspendLayout nicht hilft, wenn untergeordnete Steuerelemente geändert werden.

Muss ich einen anderen Ansatz als SuspendLayout verwenden? Gibt es eine Möglichkeit, ich kann SuspendLayout debuggen, um zu sehen, warum es nicht scheint, auf alle untergeordneten Steuerelemente zu kaskadieren?

+0

diese Antwort funktionierte für mich http://stackoverflow.com/questions/487661/how-do-i-suspend-painting-for-a-control-and-its-children – wal

Antwort

0

Verwenden Sie die in der Benutzersteuerung, die Flagge ist OptimizedDoubleBuffer, die das Flackern verhindert.

2

Zusätzlich zu @ tommieb75's Vorschlag für die doppelte Pufferung können Sie versuchen, zu sehen, ob Ihre Root-Level-Steuerelemente BeginUpdate/EndUpdate Methodenpaare haben. Diese sollten helfen, die Repaints zwischen den Aufrufen zu unterdrücken.

+1

Ein weiteres Paar Methoden zu beachten ist 'SuspendLayout()' und 'ResumeLayout()', die das Malen des Steuerelements pausieren/fortsetzen – STW

0

Wenn Sie WinForms 2+ verwenden, können Sie einfach das Steuerelement festlegen. DoubleBuffer 'Eigenschaft auf dem Steuerelement auf wahr (im Designer sogar).

Mit Framework 2 setzt die Einstellung DoubleBuffered die 3 Flags: OptimizedDoubleBuffer, AllPaintingInWmPaint und und ein anderes, das ich vergessen habe, 'UserPaint' vielleicht.

Schauen Sie sich auch das BeginUpdate/EndUpdate an, wie von @yetapb erwähnt.

14

Suspend/ResumeLayout ist nicht Ihr Problem hier. Das unterbricht nur das automatische Layout, das durch die Anker- und Dock-Eigenschaften ausgelöst wird. Double-Buffering kann Ihr Problem auch nicht beheben, da nur Flicker in jedem einzelnen Steuerelement unterdrückt wird. Ihr wirkliches Problem ist, dass Sie zu viele Steuerelemente gleichzeitig aktualisieren, jeder wird sich selbst malen und das braucht Zeit.

Was Sie brauchen, ist eine andere Art von Doppel-Pufferung, Compositing. Überprüfen Sie, ob die Lösung in this thread Ihr Problem löst.

+1

Yay, ein Extraweg :) Hoffe, ich erinnere mich daran, wenn ich es brauche. –

+0

+1 du hast meinen Tag gerettet (obwohl es spät in der Nacht ist ...) – karlipoppins

+0

Danke .. habe meine Zeit gespeichert =) – Emo