Grundsätzlich habe ich zwei Probleme mit C # .NET MDI. Sie können die VS2010-Lösung herunterladen, die Fehler hier reproduziert.
1) Beim programmatischen Ausblenden und erneutem Anzeigen eines maximierten untergeordneten Formulars wird es nicht wieder richtig maximiert und wird weder maximiert noch im normalen Zustand angezeigt.
%Vor%Wenn das untergeordnete Formular maximiert, dann programmatisch ausgeblendet und erneut angezeigt wird, wird es in etwa so angezeigt (beachten Sie die Menüleiste - das Kontrollkästchen des untergeordneten Formulars wird angezeigt, das untergeordnete Formular wird jedoch nicht maximiert):
In diesem Stadium kann die Kinderform nicht verschoben werden. Allerdings habe ich einen Workaround gefunden, indem ich einfach ein Dummy-Kind-Formular ein- und ausgeblendet habe, wodurch das tatsächliche Kind-Formular richtig maximiert wird. Aber das lässt den MDI-Bereich flimmern. Die Methoden "Invalidate", "Aktualisieren" und "Aktualisieren" wurden versucht, aber sie helfen nicht. Vielleicht gibt es andere Problemumgehungen, diesen Fehler zu beheben und MDI-Bereich nicht mit Dummy-untergeordneten Formular flackern zu lassen?
%Vor%2) Wenn das untergeordnete Formular maximiert ist, wird das Symbol des untergeordneten Formulars in der Menüleiste angezeigt. Wenn Sie jedoch das Symbol ändern müssen, während das untergeordnete Formular maximiert ist, wird das Symbol in der Menüleiste nicht aktualisiert (siehe Abbildung oben). Ich habe dafür auch einen Workaround gefunden, der im Grunde die Menüleiste versteckt und anzeigt. Das Symbol wird aktualisiert, aber es wird alles unter der Menüleiste flimmern. Die Methoden "Invalidate", "Aktualisieren" und "Aktualisieren" wurden versucht, aber sie helfen nicht. Gibt es eine andere Möglichkeit, Menüleiste zu aktualisieren, um das Symbol des unterordneten Formulars zu aktualisieren?
%Vor%Ich habe auch bemerkt, dass, wenn sich das Elternformular im normalen Fensterzustandsmodus befindet (nicht maximiert) und Sie die Breite oder Höhe des Formulars um 1 Pixel ändern, das untergeordnete Formular maximiert wird, wie es sein sollte, und das Symbol des untergeordneten Formulars in der Menüleiste ordnungsgemäß aktualisiert und Sie benötigen keine andere oben beschriebene Problemumgehung. Wenn ich die Größe des Formulars programmatisch ändere, flackert das Formular um 1 Pixel und ich kann das nicht tun, wenn das Elternformular maximiert ist. Gibt es eine Möglichkeit, wie ich die Repaint / Refresh-Funktion aufrufen kann, die aufgerufen wird, wenn Sie die Größe eines Formulars ändern und das untergeordnete Formular ordnungsgemäß maximiert und das Symbol in der Menüleiste aktualisiert?
Ich habe einen Weg gefunden, wie man diese Fehler umgehen kann.
Zuerst müssen Sie das Malen für ein Formular und seine Kinder aussetzen. Ich fand einen sehr hilfreichen Thread hier , die beschreibt, wie es geht.
Nachdem Sie den Malvorgang ausgesetzt haben, müssen Sie die UpdateBounds-Methode des Steuerelements aufrufen und die Breite oder Höhe von ClientRectangle um eins erhöhen und dann wieder auf denselben Wert wie zuvor reduzieren. Dies ruft eine Layout-Funktionalität auf, die alles zum Aktualisieren / Repaint macht. Der letzte Schritt besteht darin, das Malen zu ermöglichen. Nicht sehr nette Lösung, denke ich, aber es funktioniert.
%Vor%Ich finde das Suspendieren von Malen sehr hilfreich, nicht nur um diese beiden Fehler zu umgehen, sondern auch, um GUI insgesamt reibungsloser arbeiten zu lassen. Ich denke, das kann helfen, jede Art von Flackern zu entfernen. Diese Lösung erfordert jedoch P / Invokes, was generell vermieden werden sollte.
Es gibt einen Fehler in der Implementierung der internen MdiControlStrip-Klasse, dem Steuerelement, das das Symbol und die Min / Max / Restore-Symbole im übergeordneten Fenster anzeigt. Ich habe es noch nicht charakterisiert, der Code ist nicht so einfach. Ein klassischer Nebeneffekt des Bugs ist, dass sich die Glyphen verdoppeln, du hast einige andere Nebenwirkungen gefunden. Das Update ist jedoch einfach, verzögern die Erstellung der untergeordneten Fenster, bis der Konstruktor abgeschlossen ist. So:
%Vor%Haben Sie müde mit Hide / Show anstelle der Einstellung sichtbar für wahr / falsch?
Versuchen Sie:
%Vor%Wie steht es mit dieser Problemumgehung?
%Vor%AKTUALISIEREN
Ich habe dir nur die Idee gegeben, wie du es machen könntest. Eine bessere Lösung mit der gleichen Idee wie oben wäre eine neue Basisform, die den Windows-Status speichert. Siehe unten. Leiten Sie Ihre Formulare von FixedForm statt von Form ab:
%Vor%Warum nicht einfach das erforderliche Symbol in menuStrip-Elementen nach der Erstellung des Fensters manuell zurücksetzen:
%Vor%