Unterstützung für hohe DPI-Werte in Windows Forms
Ab .NET Framework 4.7 umfasst Windows Forms Verbesserungen für allgemeine High-DPI- und dynamische DPI-Szenarien. Dazu gehören:
Verbesserungen bei der Skalierung und dem Layout einer Reihe von Windows Forms-Steuerelementen, z. B. das MonthCalendar-Steuerelement und das CheckedListBox-Steuerelement.
Einzelschritt-Skalierung. In .NET Framework 4.6 und früheren Versionen wurde die Skalierung über mehrere Durchläufe durchgeführt, was dazu führte, dass einige Steuerelemente mehr skaliert wurden als erforderlich.
Unterstützung für dynamische DPI-Szenarien, in denen der Benutzer den DPI- oder Skalierungsfaktor ändert, nachdem eine Windows Forms-Anwendung gestartet wurde.
In Versionen von .NET Framework ab .NET Framework 4.7 ist die erweiterte Unterstützung für hohe DPI-Werte ein Opt-In-Feature. Sie müssen Ihre Anwendung so konfigurieren, dass sie es nutzen kann.
Konfigurieren Sie Ihre Windows Forms-App für hochauflösende DPI-Unterstützung
Die neuen Windows Forms-Funktionen, die hohe DPI-Unterstützung bieten, sind nur in Anwendungen verfügbar, die auf das .NET Framework 4.7 ausgerichtet sind und auf Windows-Betriebssystemen ab dem Windows 10 Creators Update laufen.
Um die Unterstützung für hohe DPI-Werte in Ihrer Windows Forms-Anwendung zu konfigurieren, müssen Sie folgendes ausführen:
Deklarieren Sie die Kompatibilität mit Windows 10.
Fügen Sie dazu der Manifestdatei Folgendes hinzu:
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- Windows 10 compatibility --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" /> </application> </compatibility>
Aktivieren Sie die DPI-Sensibilisierung pro Monitor in der app.config Datei.
Windows Forms führt ein neues
<System.Windows.Forms.ApplicationConfigurationSection>
-Element ein, um neue Features und Anpassungen zu unterstützen, die ab .NET Framework 4.7 hinzugefügt wurden. Um die neuen Features zu nutzen, die hohe DPI-Werte unterstützen, fügen Sie der Anwendungskonfigurationsdatei Folgendes hinzu.<configuration> <!-- ... other xml settings ... --> <System.Windows.Forms.ApplicationConfigurationSection> <add key="DpiAwareness" value="PerMonitorV2" /> </System.Windows.Forms.ApplicationConfigurationSection> </configuration>
Wichtig
In früheren Versionen des .NET Framework haben Sie das Manifest verwendet, um hohe DPI-Unterstützung hinzuzufügen. Dieser Ansatz wird nicht mehr empfohlen, da er Einstellungen außer Kraft setzt, die in der app.config Datei definiert sind.
Rufen Sie die statische EnableVisualStyles-Methode auf.
Dies sollte der erste Methodenaufruf in Ihrem Anwendungseinstiegspunkt sein. Zum Beispiel:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form2()); }
Deaktivieren einzelner Funktionen mit hohem DPI-Wert
Das Festlegen des DpiAwareness
-Werts auf PerMonitorV2
ermöglicht alle Funktionen mit hohem DPI-Bewusstsein, die von .NET-Framework-Versionen ab .NET Framework 4.7 unterstützt werden. In der Regel ist dies für die meisten Windows Forms-Anwendungen ausreichend. Möglicherweise möchten Sie jedoch ein oder mehrere einzelne Features deaktivieren. Der wichtigste Grund dafür ist, dass ihr vorhandener Anwendungscode dieses Feature bereits behandelt. Wenn Ihre Anwendung z. B. die automatische Skalierung behandelt, können Sie die Funktion für die automatische Größenänderung wie folgt deaktivieren:
<configuration>
<!-- ... other xml settings ... -->
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
<add key="EnableWindowsFormsHighDpiAutoResizing" value="false" />
</System.Windows.Forms.ApplicationConfigurationSection>
</configuration>
Für eine Liste von einzelnen Schlüsseln und deren Werten siehe Windows Forms Add Configuration Element.
Neue DPI-Änderungsereignisse
Ab .NET Framework 4.7 können Sie mit drei neuen Ereignissen dynamische DPI-Änderungen programmgesteuert behandeln:
- DpiChangedAfterParent, das ausgelöst wird, wenn die DPI-Einstellung für ein Steuerelement programmgesteuert geändert wird, nachdem ein DPI-Änderungsereignis für sein übergeordnetes Steuerelement oder Formular aufgetreten ist.
- DpiChangedBeforeParent, das ausgelöst wird, wenn die DPI-Einstellung für ein Steuerelement programmgesteuert geändert wird, bevor ein DPI-Änderungsereignis für das übergeordnete Steuerelement oder Formular aufgetreten ist.
- DpiChanged, das ausgelöst wird, wenn sich die DPI-Einstellung auf dem Anzeigegerät ändert, auf dem das Formular derzeit angezeigt wird.
Neue Hilfsmethoden und -eigenschaften
Das .NET Framework 4.7 fügt außerdem eine Reihe neuer Hilfsmethoden und -eigenschaften hinzu, die Informationen zur DPI-Skalierung bereitstellen und es Ihnen ermöglichen, DPI-Skalierung durchzuführen. Dazu gehören:
LogicalToDeviceUnits, der einen Wert von logischen in Gerätepixel konvertiert.
ScaleBitmapLogicalToDevice, wodurch ein Bitmapbild auf den logischen DPI-Wert für ein Gerät skaliert wird.
DeviceDpi, der den DPI-Wert für das aktuelle Gerät zurückgibt.
Überlegungen zur Versionsverwaltung
Zusätzlich zur Ausführung auf .NET Framework 4.7 und Windows 10 Creators Update kann Ihre Anwendung auch in einer Umgebung ausgeführt werden, in der sie nicht mit hohen DPI-Verbesserungen kompatibel ist. In diesem Fall müssen Sie eine Ersatzlösung für Ihre Anwendung entwickeln. Dafür können Sie eine benutzerdefinierte -Zeichnung ausführen, um die Skalierung zu handhaben.
Dazu müssen Sie auch das Betriebssystem bestimmen, auf dem Ihre App ausgeführt wird. Sie können dies mit Code wie den folgenden tun:
// Create a reference to the OS version of Windows 10 Creators Update.
Version OsMinVersion = new Version(10, 0, 15063, 0);
// Access the platform/version of the current OS.
Console.WriteLine(Environment.OSVersion.Platform.ToString());
Console.WriteLine(Environment.OSVersion.VersionString);
// Compare the current version to the minimum required version.
Console.WriteLine(Environment.OSVersion.Version.CompareTo(OsMinVersion));
Beachten Sie, dass Ihre Anwendung Windows 10 nicht erfolgreich erkennt, wenn sie im Anwendungsmanifest nicht als unterstütztes Betriebssystem aufgeführt wurde.
Sie können auch die Version von .NET Framework überprüfen, für die die Anwendung erstellt wurde:
Console.WriteLine(AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName);
Siehe auch
.NET Desktop feedback