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:
//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
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
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.
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.
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.
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.