Laden...

AutoScroll-Property des Panels hebelt SuspendLayout/ResumeLayout aus

Erstellt von _Bugrick_ vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.021 Views
_
_Bugrick_ Themenstarter:in
48 Beiträge seit 2011
vor 8 Jahren
AutoScroll-Property des Panels hebelt SuspendLayout/ResumeLayout aus

Hallo zusammen,

ich arbeite an einem umfangreichen UserControl, das dynamisch eine Oberfläche mit ziemlich vielen Controls aufbaut.

Im Grunde funktioniert auch alles einwandfrei, bis auf einen ziemlich nervigen Schönheitsfehler.

Damit sich das UserControl sauber ohne Flackern aufbaut und dann eingeblendet wird, arbeite ich mit


this.SuspendLayout();
this.ResumeLayout();

Das funktioniert auch bei allen Controls wunderbar, bis auf einem einzigen. Nämlich einem Panel. Und auch nur dann nicht, wenn ich die AutoScroll-Property auf true setze. Kommentier ich diese Zeile aus, baut sich alles sauber auf. Sobald ich die Zeile rein nehme, ist kurz folgendes zu sehen (sh. Anhang 1).

Ist das ein Bug im .NET-Framework oder mache ich etwas falsch?

Was ich schon probiert habe ist:

  • Autoscroll an verschiedenen anderen Stelle zu setzen, auch nach ResumeLayout
  • Ebenfalls mit SuspendLayout and ResumeLayout für das Panel zu arbeiten

//Panels um scrollen zu können
//pnl[a].AutoScroll = true;
pnl[a].Controls.Add(tlp[a]);                   
pnl[a].Dock = DockStyle.Fill;
pnl[a].Location = new Point(0, 0);
pnl[a].Name = string.Concat("pnl", a.ToString());
pnl[a].Size = new Size(100, 100);
//pnl[a].AutoScroll = true;

Bin für jede Hilfe dankbar.

Gruß
Bugrick

5.657 Beiträge seit 2006
vor 8 Jahren

Hi Bugrick,

dein Bild zeigt eine blaue Fläche mit einer Scrollbar. Auch aus deiner Beschreibung werde ich nicht schlau. Was willst du denn eigentlich erreichen? Wie soll es denn aussehen und was funktioniert dabei nicht? Wie kommst du darauf, daß es an SuspendLayout liegt oder gar ein Bug im Framework ist?

Christian

Weeks of programming can save you hours of planning

_
_Bugrick_ Themenstarter:in
48 Beiträge seit 2011
vor 8 Jahren

Vielleicht fehlt doch noch etwas Kontext.

Die blaue Fläche ist das ganze UserControl etwas verkleinert.
Beim Laden des Controls sieht man schon kurz (für den Bruchteil einer Sekunde) die Scrollbar, bevor sie sich final sauber rechts positioniert, zusammen mit dem Rest des UserControls.
Übrigens findet alles in der GUI-Thread statt. Nichts Threadübergreifendes.

Eben eine Gegenprobe gemacht: Nutzt man beispielsweise das "UltraPanel" der Infragistics-Softwarekomponenten klappt das ganze ebenfalls problemlos, ohne, dass man beim Aufbau des UserControls kurz die Scrollbar mitten ins Nichts eingeblendet bekommt.

F
10.010 Beiträge seit 2004
vor 8 Jahren

Dein Problem ist eher

das dynamisch eine Oberfläche mit ziemlich vielen Controls aufbaut.

Das ist nie eine Gute Wahl, denn in WindowsForms hat jedes Control mindestens ein Handle und die werden schnell knapp, bzw werden alle per WindowsMessage nacheinander gemalt.
Besser ist es wenn man partout viele Controls benutzen will auf WPF umzusteigen oder das meiste selber zu zeichnen.

W
195 Beiträge seit 2008
vor 8 Jahren

Dein Problem ist eher

das dynamisch eine Oberfläche mit ziemlich vielen Controls aufbaut.
Das ist nie eine Gute Wahl, denn in WindowsForms hat jedes Control mindestens ein Handle und die werden schnell knapp, bzw werden alle per WindowsMessage nacheinander gemalt.
Besser ist es wenn man partout viele Controls benutzen will auf WPF umzusteigen oder das meiste selber zu zeichnen.

Das Limit liegt bei ungefähr 10.000 Handles pro Prozess - wenn die ausgeschöpft werden, hat man ein Design-Problem, dass auch mit WPF nicht zu erschlagen ist.

Das Problem wird eher sein, dass das Eltern-Control bereits sichtbar ist während die 'Kind'-Controls hinzugefügt werden. Hier bietet es sich an das Eltern-Control zu verbergen, dann die KindControls hinzuzufügen und anschließend das Eltern-Control wieder anzuzeigen. Um 'flackern' zu vermeiden sollte ausserdem DoubleBuffered beim Eltern-Control auf true gestellt und die Kind-Controls bereits in der korrekten Größe hinzugefügt werden (so man mit Docking und ähnlichem arbeitet).

Ausserdem sollte man 'Transparent' als Background-Color generell aber besonders für Panels und ähnliche Container vermeiden.

F
10.010 Beiträge seit 2004
vor 8 Jahren

Das Theoretische Limit ist da, aber da wie gesagt jedes Control per Paint-Msg gezeichnet wird ist es eher bei >200 Handles nicht mehr flackerfrei.