Automatische Skalierung (Windows Forms .NET)

Die automatische Skalierung ermöglicht, dass ein Formular und seine Steuerelemente, die auf einem Computer mit einer bestimmten Bildschirmauflösung oder Schriftart entworfen wurden, ordnungsgemäß auf einem anderen Computer angezeigt werden, der eine andere Bildschirmauflösung oder Schriftart hat. Durch sie wird sichergestellt, dass die Größen des Formulars und seiner Steuerelemente intelligent geändert werden, sodass diese sowohl auf den Computern von Benutzern als auch auf denen von anderen Entwicklern konsistent zu systemeigenen Fenstern sowie anderen Anwendungen sind. Die automatische Skalierung und visuelle Stile ermöglichen Windows Forms-Anwendungen im Vergleich zu nativen Windows-Anwendungen ein konsistentes Aussehen und Verhalten auf dem Computer jedes Benutzers.

Im Wesentlichen funktioniert die automatische Skalierung in Windows Forms wie erwartet. Änderungen des Schriftartenschemas können jedoch problematisch sein.

Wichtig

Der Desktopleitfaden zu .NET 7 und .NET 6 ist in Bearbeitung.

Notwendigkeit der automatischen Skalierung

Ohne automatische Skalierung würde eine Anwendung, die für eine bestimmte Bildschirmauflösung oder Schriftart entworfen wurde, entweder zu klein oder zu groß angezeigt, wenn diese Auflösung oder Schriftart geändert wird. Wurde die Anwendung beispielsweise mit Tahoma 9 Punkt als Basis entworfen, würde sie ohne Anpassung zu klein angezeigt, wenn sie auf einem Computer ausgeführt würde, der die Systemschriftart Tahoma 12 Punkt hat. Textelemente wie Titel, Menüs, Textfeldinhalt usw. werden kleiner gerendert als andere Anwendungen. Darüber hinaus richtet sich die Größe der Benutzeroberflächenelemente, die Text enthalten, etwa die Titelleiste, Menüs und viele Steuerelemente, nach der verwendeten Schriftart. In diesem Beispiel werden diese Elemente zusätzlich relativ kleiner angezeigt.

Die gleiche Situation ergibt sich, wenn eine Anwendung für eine bestimmte Bildschirmauflösung entworfen wurde. Die gängigste Bildschirmauflösung ist 96 DPI (Dots Per Inch), was einer Bildschirmskalierung von 100 Prozent entspricht, aber Bildschirme mit höherer Auflösung, die eine Skalierung von 125, 150, 200 Prozent (entsprechen 120, 144 und 192 DPI) oder darüber unterstützen, werden immer häufiger. Ohne Anpassung wird eine Anwendung, insbesondere eine Grafikanwendung, die für eine bestimme Auflösung entworfen wurde, entweder zu groß oder zu klein angezeigt, wenn sie mit einer anderen Auflösung ausgeführt wird.

Mit der automatischen Skalierung lassen sich diese Probleme beheben, indem die Größen des Formulars und seiner untergeordneten Steuerelemente entsprechend der relativen Schriftgröße oder Bildschirmauflösung geändert werden. Windows unterstützt die automatische Skalierung von Dialogfeldern durch Verwenden einer relativen Maßeinheit, die als Dialogeinheiten bezeichnet wird. Eine Dialogeinheit basiert auf der Systemschriftart, und ihre Beziehung zu Pixeln kann über die Win32 SDK-Funktion GetDialogBaseUnits bestimmt werden. Wenn ein Benutzer das von Windows verwendete Design ändert, werden alle Dialogfelder automatisch entsprechend angepasst. Zusätzlich unterstützt Windows Forms die automatische Skalierung entweder entsprechend der Standardsystemschriftart oder der Bildschirmauflösung. Optional kann die automatische Skalierung in einer Anwendung deaktiviert werden.

Achtung

Beliebige Kombinationen aus DPI- und Schriftartskalierungsmodi werden nicht unterstützt. Obwohl Sie ein Benutzersteuerelement mithilfe eines Modus (z. B. DPI) skalieren und ohne Probleme auf einem Formular platzieren können, für das ein anderer Modus (Schriftart) verwendet wird, kann es zu unerwarteten Ergebnissen kommen, wenn Sie ein Grundformular in einem Modus mit einem abgeleiteten Formular in einem anderen Modus mischen.

Automatische Skalierung in der Praxis

Windows Forms verwendet die folgende Logik, um Formulare und deren Inhalte automatisch zu skalieren:

  1. Zur Entwurfszeit speichert jede ContainerControl-Instanz den Skalierungsmodus und ihre aktuelle Auflösung in der AutoScaleMode- bzw. der AutoScaleDimensions-Eigenschaft.

  2. Zur Laufzeit wird die tatsächliche Auflösung in der CurrentAutoScaleDimensions-Eigenschaft gespeichert. Die AutoScaleFactor-Eigenschaft berechnet dynamisch das Verhältnis zwischen der Laufzeit- und der Entwurfszeitskalierungsauflösung.

  3. Wenn das Formular geladen wird und sich die Werte von CurrentAutoScaleDimensions und AutoScaleDimensions unterscheiden, wird die PerformAutoScale-Methode aufgerufen, um das Steuerelement und dessen untergeordneten Elemente zu skalieren. Diese Methode übergeht das Layout und ruft die Scale-Methode auf, um die tatsächliche Skalierung auszuführen. Danach wird der Wert von AutoScaleDimensions aktualisiert, um weitere Skalierung zu vermeiden.

  4. PerformAutoScale wird auch in den folgenden Situationen automatisch aufgerufen:

    • Als Reaktion auf das OnFontChanged-Ereignis, wenn der Skalierungsmodus gleich Font ist.

    • Wenn wieder das Layout des Containersteuerelements verwendet wird und eine Änderung in der AutoScaleDimensions- oder der AutoScaleMode-Eigenschaft erkannt wurde.

    • Wenn, wie soeben erwähnt, ein übergeordnetes ContainerControl skaliert wird. Jedes Containersteuerelement muss seine untergeordneten Elemente mit seinen eigenen Skalierungsfaktoren skalieren, es darf dafür nicht den Faktor seines übergeordneten Containers verwenden.

  5. Untergeordnete Steuerelemente können ihr Skalierungsverhalten auf mehrere Arten ändern:

    • Die ScaleChildren-Eigenschaft kann überschrieben werden, um zu bestimmen, ob die untergeordneten Steuerelemente skaliert werden sollen oder nicht.

    • Die GetScaledBounds-Methode kann überschrieben werden, um die Begrenzungen für die Skalierung des Steuerelements, aber nicht die Skalierungslogik anzupassen.

    • Die ScaleControl-Methode kann überschrieben werden, um die Skalierungslogik für das aktuelle Steuerelement zu ändern.

Siehe auch