Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Mit der automatischen Skalierung kann ein Formular und seine Steuerelemente, die auf einem Computer mit einer bestimmten Anzeigeauflösung oder Schriftart entworfen wurden, auf einem anderen Computer mit einer anderen Anzeigeauflösung oder Schriftart entsprechend angezeigt werden. Formulare und Steuerelemente ändern die Größe intelligent, um mit systemeigenen Fenstern und anderen Anwendungen auf den Computern der Benutzer und anderer Entwickler konsistent zu bleiben. Automatische Skalierung und visuelle Stile helfen Windows-Forms-Anwendungen dabei, ein einheitliches Erscheinungsbild beizubehalten, das mit dem nativer Windows-Anwendungen auf dem Computer des jeweiligen Benutzers übereinstimmt.
Die automatische Skalierung funktioniert größtenteils wie erwartet in Windows Forms. Schriftartenschemaänderungen können jedoch problematisch sein. Ein Beispiel dafür, wie Sie dieses Problem beheben, finden Sie unter Anleitung: Reagieren auf Änderungen des Schriftschemas in einer Windows Forms-Anwendung.
DPI-Bewusstsein in .NET
Die DPI-Sensibilisierung wird über die Projektdatei mithilfe der ApplicationHighDpiMode Eigenschaft konfiguriert, die standardmäßig auf SystemAware festgelegt ist. Diese Konfiguration funktioniert mit dem Anwendungs-Bootstrap-System, um die DPI-Behandlung beim Start der Anwendung automatisch zu konfigurieren.
Der standardmäßige und empfohlene DPI-Modus für Windows Forms Anwendungen ist SystemAware. Dieser Modus fragt die DPI-Einstellung einmal beim Starten der Anwendung ab und verwendet diesen Wert während der gesamten Lebensdauer der Anwendung, wodurch ein konsistentes Skalierungsverhalten gewährleistet wird.
Konfigurieren des DPI-Modus in der Projektdatei:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ApplicationHighDpiMode>SystemAware</ApplicationHighDpiMode>
</PropertyGroup>
</Project>
Note
Während der empfohlene Ansatz darin besteht, DPI über die Projektdatei zu konfigurieren, können Sie weiterhin eine Anwendungsmanifestdatei (app.manifest) verwenden, um diese Einstellungen außer Kraft zu setzen. Die Verwendung des Manifests wird jedoch davon abgeraten, da sie Konflikte mit der Anwendungskonfiguration verursachen kann. Weitere Informationen finden Sie unter Compilerwarnung WFO0003.
Überlegungen zu Visual Studio Designer
Beim Entwerfen von Formularen in Visual Studio müssen Sie möglicherweise das DPI-Bewusstsein des Designers separat von Ihrer Anwendung konfigurieren. Ab Version 17.8 von Visual Studio 2022 können Sie die Eigenschaft ForceDesignerDPIUnaware in Ihrer Projektdatei festlegen, damit der Windows Forms-Designer im DPI-unbewussten Modus ausgeführt wird. Diese Einstellung trägt dazu bei, Renderingprobleme beim Entwerfen von Formularen auf Monitoren mit hohem DPI-Wert zu vermeiden:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ForceDesignerDPIUnaware>true</ForceDesignerDPIUnaware>
</PropertyGroup>
</Project>
Diese Eigenschaft wirkt sich nur auf den Visual Studio-Designer aus und ändert nicht die Ausführung der Anwendung. Weitere Informationen finden Sie unter Deaktivieren des DPI-Bewusstseins, um Skalierungsprobleme zu beheben.
Zu den verfügbaren DPI-Modi gehören:
-
SystemAware– Die Anwendung fragt den DPI-Wert einmal beim Start ab und verwendet diesen Wert für die Lebensdauer der App. -
PerMonitor—Die Anwendung überprüft für jeden Monitor, ob sich der DPI-Wert ändert, und skaliert sich bei DPI-Änderungen neu. -
PerMonitorV2—Ähnlich wiePerMonitor, aber ermöglicht DPI-Änderungsbenachrichtigungen für untergeordnete Fenster und ein verbessertes Skalierungsverhalten. -
DpiUnaware– Die Anwendung skaliert nicht für DPI-Änderungen, und Windows behandelt die Skalierung. -
DpiUnawareGdiScaled— Ähnlich wieDpiUnawarebei GDI-basierten Inhalten bietet sie jedoch eine bessere Qualität.
Weitere Informationen zum Konfigurieren von DPI-Einstellungen finden Sie unter Neuigkeiten in Windows Forms für .NET 6.
Notwendigkeit der automatischen Skalierung
Ohne automatische Skalierung wird eine Anwendung, die für eine Anzeigeauflösung oder Schriftart entwickelt wurde, zu klein oder zu groß angezeigt, wenn sich diese Auflösung oder Schriftart ändert. Wenn Sie beispielsweise eine Anwendung mit Tahoma 9 Punkt als Basislinie entwerfen, erscheint sie ohne Anpassung zu klein, wenn sie auf einem Computer ausgeführt wird, auf dem die Systemschriftart Tahoma 12 Punkt ist. Textelemente wie Titel, Menüs und die Inhalte von Textfeldern werden kleiner dargestellt als in anderen Anwendungen. Darüber hinaus hängt die Größe von Ui-Elementen, die Text enthalten, z. B. die Titelleiste, Menüs und viele Steuerelemente, von der verwendeten Schriftart ab. In diesem Beispiel werden diese Elemente auch relativ kleiner angezeigt.
Eine analoge Situation tritt auf, wenn Sie eine Anwendung für eine bestimmte Anzeigeauflösung entwerfen. Die gängigste Anzeigeauflösung beträgt 96 Punkte pro Zoll (DPI), was einer Anzeigeskalierung von 100 % entspricht, aber Displays mit höherer Auflösung, die 125 %, 150 %, 200 % (was jeweils 120, 144 bzw. 192 DPI entspricht) und mehr unterstützen, werden immer häufiger. Ohne Anpassung erscheint eine Anwendung, insbesondere eine grafikbasierte, für eine Auflösung ausgelegte, entweder zu groß oder zu klein, wenn sie mit einer anderen Auflösung ausgeführt wird.
Die automatische Skalierung behebt diese Probleme, indem die Größe des Formulars und seiner untergeordneten Steuerelemente entsprechend dem relativen Schriftgrad oder der Anzeigeauflösung automatisch geändert wird. Das Windows-Betriebssystem unterstützt die automatische Skalierung von Dialogfeldern mithilfe einer relativen Maßeinheit, die als Dialogeinheiten bezeichnet wird. Eine Dialogeinheit basiert auf der Systemschriftart, und die Beziehung zu Pixeln kann über die Win32 SDK-Funktion GetDialogBaseUnitsbestimmt werden. Wenn ein Benutzer das von Windows verwendete Design ändert, werden alle Dialogfelder automatisch entsprechend angepasst. Windows Forms unterstützt die automatische Skalierung entweder gemäß der Standardschriftart des Systems oder der Anzeigeauflösung. Optional können Sie die automatische Skalierung in einer Anwendung deaktivieren.
Vorsicht
Beliebige Mischungen aus DPI- und Schriftskalierungsmodi werden nicht unterstützt. Sie können ein Benutzersteuerelement zwar mit einem Modus (z. B. DPI) skalieren und es in einem Formular ohne Probleme in einem anderen Modus (Schriftart) platzieren, das Mischen eines Basisformulars in einem Modus und einem abgeleiteten Formular in einem anderen kann zu unerwarteten Ergebnissen führen.
Automatische Skalierung in Aktion
Windows Forms verwendet die folgende Logik, um Formulare und deren Inhalte automatisch zu skalieren:
Zur Entwurfszeit speichert jedes ContainerControl den Skalierungsmodus bzw. seine aktuelle Auflösung in den Eigenschaften AutoScaleMode bzw. AutoScaleDimensions.
Zur Laufzeit wird die tatsächliche Auflösung in der eigenschaft CurrentAutoScaleDimensions gespeichert. Die AutoScaleFactor-Eigenschaft berechnet dynamisch das Verhältnis zwischen der Laufzeit- und der Entwurfszeit-Skalierungsauflösung.
Wenn das Formular geladen wird, wenn sich die Werte von CurrentAutoScaleDimensions und AutoScaleDimensions unterscheiden, wird die PerformAutoScale Methode aufgerufen, um das Steuerelement und seine untergeordneten Elemente zu skalieren. Diese Methode unterbricht das Layout und ruft die Scale-Methode auf, um die tatsächliche Skalierung durchzuführen. Anschließend wird der Wert von AutoScaleDimensions aktualisiert, um eine progressive Skalierung zu vermeiden.
PerformAutoScale wird auch in den folgenden Situationen automatisch aufgerufen:
Als Reaktion auf das OnFontChanged-Ereignis, wenn der Skalierungsmodus Font entspricht
Wenn wieder das Layout des Containersteuerelements verwendet wird und eine Änderung in der Eigenschaft AutoScaleDimensions oder AutoScaleMode erkannt wurde
Wenn ein übergeordnetes Element ContainerControl skaliert wird. Jedes Containersteuerelement muss seine untergeordneten Elemente mit seinen eigenen Skalierungsfaktoren skalieren, und es darf dafür nicht den Faktor seines übergeordneten Containers verwenden.
Untergeordnete Steuerelemente können ihr Skalierungsverhalten auf mehrere Arten ändern:
Überschreiben Sie die ScaleChildren-Eigenschaft, um festzulegen, ob deren untergeordnete Steuerelemente skaliert werden sollen.
Überschreiben Sie die GetScaledBounds Methode, um die Grenzen anzupassen, auf die das Steuerelement skaliert wird, aber nicht auf die Skalierungslogik.
Überschreiben Sie die ScaleControl Methode, um die Skalierungslogik für das aktuelle Steuerelement zu ändern.
Verbesserungen bei hohen DPI-Werten
.NET enthält erhebliche Verbesserungen beim Rendern hoher DPI-Werte, insbesondere im PerMonitorV2 Modus:
- Dpi-Sensibilisierung pro Monitor – Anwendungen werden dynamisch angepasst, wenn sie zwischen Monitoren mit unterschiedlichen DPI-Einstellungen verschoben werden.
- Verbessertes Skalierungsverhalten : Steuerelemente werden korrekt skaliert, wenn DPI-Änderungen vorgenommen werden, einschließlich geschachtelter Steuerelemente und Containersteuerelemente (.NET 6+).
- Skalierung der Formulargröße –MaximumSize und MinimumSize Eigenschaften werden basierend auf den aktuellen DPI-Einstellungen des Monitors skaliert (.NET 7+, standardmäßig in .NET 8+) aktiviert.
-
DPI-Änderungsereignisse – Mit neuen Ereignissen können Sie dynamische DPI-Änderungen programmgesteuert behandeln:
- DpiChanged– Wird ausgelöst, wenn sich die DPI-Einstellung auf dem Anzeigegerät ändert, auf dem das Formular derzeit angezeigt wird.
- DpiChangedBeforeParent– Wird ausgelöst, wenn sich die DPI-Einstellung für ein Steuerelement programmgesteuert ändert, bevor ein DPI-Änderungsereignis für das übergeordnete Steuerelement oder Formular auftritt.
- DpiChangedAfterParent– Wird ausgelöst, wenn sich die DPI-Einstellung für ein Steuerelement programmgesteuert ändert, nachdem ein DPI-Änderungsereignis für das übergeordnete Steuerelement oder Formular auftritt.
Weitere Informationen zu verbesserungen bei hohen DPI-Werten finden Sie unter Neuigkeiten in Windows Forms für .NET 6, Neuigkeiten in Windows Forms für .NET 7 und Neuigkeiten in Windows Forms für .NET 8.
.NET Framework-Unterschiede
.NET Framework und .NET behandeln die DPI-Sensibilisierung anders:
- Konfigurieren Sie in .NET Framework die DPI-Sensibilisierung über eine app.config Datei mit dem
<System.Windows.Forms.ApplicationConfigurationSection>Element. - Konfigurieren Sie in .NET die DPI-Sensibilisierung über die Projektdatei mit der
ApplicationHighDpiModeEigenschaft. - .NET Framework verwendet Manifestdateien für die DPI-Konfiguration, die nicht mehr empfohlen wird.
- .NET bietet ein besseres Skalierungsverhalten und zuverlässigere DPI-Änderungsbehandlung.
Informationen zur DPI-Konfiguration .NET Frameworks finden Sie unter Unterstützung für hohe DPI-Werte in Windows Forms.
Siehe auch
.NET Desktop feedback