Laden...

Achors und MDI Form maximieren

Erstellt von chilic vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.255 Views
C
chilic Themenstarter:in
2.121 Beiträge seit 2010
vor 11 Jahren
Achors und MDI Form maximieren

Hallo Forum

Ich häng grad an einem Problem, zu dem mir nicht mal ein gescheiter Titel einfällt. Eine passable Beschreibung auch nicht, vielleicht mags jemand ausprobieren oder kann sich zumindest anhand des Codes vorstellen was ich da mache.
Es gibt ein Formular mit IsMdiContainer = true. Button drauf, im ButtonClick wird ein weiteres Formular erzeugt und als MDI angezeigt:

Form2 frm = new Form2();
frm.MdiParent = this;
frm.Show();

In Form2 ist ein Panel namens panel1 mit Hintergrundfarbe (damit man es erkennt) und die Anchors Top, Left, Bottom sind gesetzt, damit das Panel eine Änderung der Höhe des Formulars mit macht.
Dann das Programm starten. Auf den Button drücken, Form2 geht auf und das Panel erscheint.
Form2 maximieren, das Panel wächst mit. Nochmal Button drücken, ein zweites Form2 geht bereits maximiert auf, das Panel ist auch in ihm wieder mit gewachsen. Bisher alles so wie es soll.

Jetzt lege ich im Form2 Form_Load an und schreibe da rein:

panel1.Width = panel1.Width - 10;

Dann nochmal das Spielchen machen. Das erste Form2 maximieren, dann nochmal eines öffnen.
Dieses öffnet sich wieder maximiert, aber das Panel ist dieses Mal in der Originalgröße des Designers geblieben. Die Anker funktionieren, nur hat das Panel das Maximize anscheinend nicht mehr mitgekriegt, sondern hat sich in seiner Designgröße belassen.

Warum? Ich such da schon den halben Tag quer durch den Debugger bis zu diesem Minimalcode.
Bringt das setzen von Width hier tatsächlich die Anker durcheinander? Und wie könnte ich das umgehen?
Bin für jeden Ansatz dankbar.
Übrigens: VS2008 mit .NET 3,5

T
40 Beiträge seit 2012
vor 11 Jahren

Hi!
Ich hab das gerade versucht:


  panel1.Width = panel1.Width - 180;
   Application.DoEvents();

versuchs mal damit. Bei mir zeigt er das in dem moment richtig an.
Bilder sind immer hilfreich 😉

lg
telly

Warnung von Abt vor 11 Jahren

Achtung: Warum DoEvents Mist ist!

2.187 Beiträge seit 2005
vor 11 Jahren

Hallo chilic,

so weit mit bekannt ist Anchor nicht sehr performant/effektiv, daher vermeide ich es wan immer möglich. Das geht, da .Net auch noch eine zweite automatische Größenfunktion hat. Diese ist manchmal etwas umständlicher aber meistens (gefühlt) verständlicher und weniger Fehleranfällig.

Ich spreche über Dock, welches in Kombination mit Padding und Margin wunder bar funktioniert und im Designer eingestellt werden kann.
Man muss die Form nur mit Container-Controls (die unsichtbar sein können) sauber unterteilen (Panel, TableLayoutPanel, SplitContainer, ... etc.).

Also ich würde das ganze mal mit Dock=Fill und Margine={0,0,0,10} ausprobieren. ((Ich habs jetzt selber nicht versucht.))

Gruß
Juy Juka

C
chilic Themenstarter:in
2.121 Beiträge seit 2010
vor 11 Jahren

DoEvents könnte in diesem Fall vielleicht noch akzeptabel sein. Bei mir hilft es an dieser Stelle komischerweise aber nicht.

Das ganze soll ein Panel ein und ausblenden. Entsprechend soll ein anderes Panel seine Breite verändern, damit das neue Platz hat. Also entweder ist Panel 1 auf voller Breite, oder Panel 2 ist zusätzlich sichtbar, dann soll Panel 1 um diese Breite schmaler sein.
Bisher berechne ich mir die neue Breite von Panel 1 ganz einfach, insgesamt sind es dann zwei Zeilen Code um das ein/ausblenden zu erreichen und ich kann per Maus die Elemente im Designer so hin ziehen wie ich sie haben will. Die Anker sorgen dafür dass sich trotzdem alles bei Größenänderungen anpasst. Das ist komfortabel und überschaubar, deswegen möchte ich einen Wust an zusätzlichen Panels möglichst vermeiden.

Wenn ich Width im Konstruktor des Formulars setze funktioniert es. Das passt mir zwar auch nicht so ganz, scheint aber die einfachste Lösung zu sein.
Mich würde nur noch interessieren, warum dieser Effekt hier plötzlich aufgetreten ist.

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo chilic,

erst alle Größen richtig setzen, dann ankern. Wenn man zu früh ankert und dann noch Größen ändert, entfaltet der Anker schon seine - in diesem Fall nicht erwünschte - Wirkung. Genau das gleiche kann bei nachträglichen Größenänderungen der Fall sein. In diesem Fall sollte der Anker erst entfernt, dann die Größe geändert werden und dann wieder neu geankert werden.

herbivore

2.187 Beiträge seit 2005
vor 11 Jahren

Hallo chillic,

also genau dieses Verhalten ist im SplitContainer implementiert, da er seine Teil-Panels automatisch ein und Ausklappen kann.

Genauso einfach kann man das mit einem Pannel auf Dock=Fill und einem zweiten Panel auf Dock=Left/Right machen, das Doch=Fill-Panel nimt automatisch den Platz des anderen mit ein, wenn man das Doc=Left/Right auf Visible=False setzt.

Den Inhalt in den Panels kann man mit einem TableLayoutPanel sauber gestalten oder (wenn man will) innen dann mit Anchor arbeiten.

Also insgesamt hätte man 0-3 Controls extra (je nach dem wie es jetzt schon aufgeteilt ist und welche ContainerControl man verwendet).

Gruß
Juy Juka

T
40 Beiträge seit 2012
vor 11 Jahren

Hallo
Bei mir hat DoEvents geholfen.
Nutz die Anweisung nur ganz ganz selten bzw. brauch ich sie sehr selten.

lg
telly