2008-09-04 18 views
4

Meine App verfügt über viele Steuerelemente auf ihrer Oberfläche und weitere werden zur Laufzeit dynamisch hinzugefügt.Windows Forms-Anwendungsleistung

Obwohl ich Registerkarten verwende, um die Anzahl der angezeigten Steuerelemente und Doppelpufferung zu begrenzen, flackert und stottert es immer noch, wenn es neu gezeichnet werden muss (Größe ändern, maximieren usw.).

Was sind Ihre Tipps und Tricks zur Verbesserung der WinForms-App-Leistung?

Antwort

4

Ich kenne zwei Dinge, die Sie tun können, aber sie nicht immer auf alle Situationen anwenden.

  1. Sie werden eine bessere Leistung erhalten, wenn Sie für jede Steuer absolute Positionierung verwenden (myNewlyCreatedButton.Location.X/Y) im Gegensatz ein Flusslayoutfeld oder eine Tabelle Layout-Panel zu verwenden. WinForms muss viel weniger rechnen, um herauszufinden, wo die Steuerelemente platziert werden sollen.

  2. Wenn es eine einzelne Operation gibt, in der Sie viele Steuerelemente hinzufügen/entfernen/ändern, rufen Sie "SuspendLayout()" auf dem Container der betroffenen Steuerelemente auf (ob es ein Panel oder das gesamte Formular ist) Wenn Sie mit Ihrer Arbeit fertig sind, rufen Sie "ResumeLayout()" im selben Fenster auf. Wenn Sie dies nicht tun, muss das Formular jedes Mal, wenn Sie ein Steuerelement hinzufügen/entfernen/ändern, einen Layout-Durchlauf durchführen, was viel mehr Zeit kostet. siehe: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.suspendlayout(VS.80).aspx

Obwohl, ich bin nicht sicher, wie diese Ansätze anwenden könnten, wenn ein Fenster Größe ändern.

2

Obwohl ich nicht sicher bin, wie diese Ansätze bei der Größenänderung eines Fensters gelten könnten.

Behandeln Sie die Ereignisse ResizeBegin und ResizeEnd, um SuspendLayout() und ResumeLayout() aufzurufen. Diese Ereignisse sind nur in der System.Windows.Form-Klasse (obwohl ich wünschte, sie waren auch auf Steuerelement).

3

Obwohl allgemeiner als einige der anderen Tipps, hier ist mein:

Wenn eine große Anzahl von „Elementen“ verwenden, versuchen Sie eine Steuerung für jeden von ihnen zu vermeiden, zu schaffen, sondern die Kontrollen wiederverwenden. Wenn Sie zum Beispiel 10 000 Elemente haben, die jeweils einer Schaltfläche entsprechen, ist es sehr einfach, (programmatisch) 10 000 Schaltflächen zu erstellen und ihre Ereignisbehandlungsroutinen so zu verkabeln, dass Sie genau wissen, welches Element Sie im Ereignishandler eingeben Sie müssen daran arbeiten. Es ist jedoch viel effizienter, wenn Sie zum Beispiel 500 Buttons erstellen (weil Sie wissen, dass nur 500 Buttons gleichzeitig auf dem Bildschirm sichtbar sein werden) und eine "Mapping-Ebene" zwischen den Buttons und den Items einfügen, was dynamisch ist weist die Knöpfe jedes Mal anderen Gegenständen zu, wenn der Benutzer etwas tut, was dazu führen würde, dass der Satz von Knöpfen geändert wird, die sichtbar sein sollen (wie zum Beispiel das Bewegen einer Bildlaufleiste).