Hohe DPI-Unterstützung in Windows FormsHigh DPI support in Windows Forms

Ab .NET Framework 4.7 enthält Windows Forms-Erweiterungen für allgemeine hohen dpi-WERTEN und dynamische DPI-Szenarien.Starting with the .NET Framework 4.7, Windows Forms includes enhancements for common high DPI and dynamic DPI scenarios. Dazu gehören:These include:

  • Verbesserungen bei der die Skalierung und das Layout einer Reihe von Windows Forms-Steuerelemente, z. B. die MonthCalendar Steuerelement und die CheckedListBox Steuerelement.Improvements in the scaling and layout of a number of Windows Forms controls, such as the MonthCalendar control and the CheckedListBox control.

  • Single-Pass-Skalierung.Single-pass scaling. In .NET Framework 4.6 und früheren Versionen Skalierung über mehrere Durchläufe erfolgt die verursacht einige Steuerelemente skaliert werden, mehr als notwendig war.In the .NET Framework 4.6 and earlier versions, scaling was performed through multiple passes, which caused some controls to be scaled more than was necessary.

  • Unterstützung für dynamische DPI-Szenarien, in denen der Benutzer den Faktor für die DPI-Einstellung oder Skalierung geändert wird, nachdem eine Windows Forms-Anwendung gestartet wurde.Support for dynamic DPI scenarios in which the user changes the DPI or scale factor after a Windows Forms application has been launched.

In Versionen von .NET Framework ab .NET Framework 4.7 ist die verbesserte Unterstützung für hohe DPI-Werte ein optionales Feature.In versions of the .NET Framework starting with the .NET Framework 4.7, enhanced high DPI support is an opt-in feature. Sie müssen Ihre Anwendung nutzen, konfigurieren.You must configure your application to take advantage of it.

Konfigurieren der Windows Forms-app für die Unterstützung hoher DPI-WertConfiguring your Windows Forms app for high DPI support

Die neuen Windows Forms-Funktionen, die hohe DPI-Unterstützung unterstützen stehen nur in Anwendungen, die .NET Framework 4.7 und auf Windows-Betriebssystemen ab Windows 10 Creators Update ausgeführt werden.The new Windows Forms features that support high DPI awareness are available only in applications that target the .NET Framework 4.7 and are running on Windows operating systems starting with the Windows 10 Creators Update.

Um Unterstützung für hohe DPI-Werte in der Windows Forms-Anwendung konfigurieren zu können, müssen Sie außerdem Folgendes ausführen:In addition, to configure high DPI support in your Windows Forms application, you must do the following:

  • Deklarieren Sie die Kompatibilität mit Windows 10.Declare compatibility with Windows 10.

    Zu diesem Zweck fügen Sie Folgendes zur Manifestdatei:To do this, add the following to your manifest file:

    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
      <application>
        <!-- Windows 10 compatibility -->
        <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
      </application>
    </compatibility>
    
  • Aktivieren Sie monitorspezifische DPI-Unterstützung in den "App.config" Datei.Enable per-monitor DPI awareness in the app.config file.

    Windows Forms wird ein neuer <System.Windows.Forms.ApplicationConfigurationSection> Element zur Unterstützung der neuen Features und Anpassungen, die ab .NET Framework 4.7 hinzugefügt.Windows Forms introduces a new <System.Windows.Forms.ApplicationConfigurationSection> element to support new features and customizations added starting with the .NET Framework 4.7. Um die neuen Funktionen nutzen, die hohe DPI-Werte unterstützen, fügen Sie Folgendes der Konfigurationsdatei Ihrer Anwendung.To take advantage of the new features that support high DPI, add the following to your application configuration file.

    <System.Windows.Forms.ApplicationConfigurationSection>
      <add key="DpiAwareness" value="PerMonitorV2" />
    </System.Windows.Forms.ApplicationConfigurationSection>      
    

    Wichtig

    In früheren Versionen von .NET Framework müssen Sie das Manifest hinzuzufügende Unterstützung hohen DPI-Wert verwendet.In previous versions of the .NET Framework, you used the manifest to add high DPI support. Dieser Ansatz wird nicht mehr empfohlen, da er auf die Datei "App.config" definierte Einstellungen überschreibt.This approach is no longer recommended, since it overrides settings defined on the app.config file.

  • Rufen Sie die statische EnableVisualStyles Methode.Call the static EnableVisualStyles method.

    Dies sollte der erste Methodenaufruf in der Einstiegspunkt für Ihre Anwendung sein.This should be the first method call in your application entry point. Zum Beispiel:For example:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form2());   
    }
    

Deaktivieren der einzelnen Funktionen für hohe DPI-WertOpting out of individual high DPI features

Festlegen der DpiAwareness Wert PerMonitorV2 hohe DPI-Awareness-Funktionen, die von .NET Framework-Versionen ab .NET Framework 4.7 unterstützt werden können.Setting the DpiAwareness value to PerMonitorV2 enables all high DPI awareness features supported by .NET Framework versions starting with the .NET Framework 4.7. In der Regel ist dies ausreichend, für die meisten Windows Forms-Anwendungen.Typically, this is adequate for most Windows Forms applications. Möglicherweise möchten jedoch ein oder mehrere einzelne Features deaktivieren.However, you may want to opt out of one or more individual features. Der wichtigste Grund dafür ist, dass es sich bei Ihrem vorhandenen Code der Anwendung bereits die Funktion behandelt.The most important reason for doing this is that your existing application code already handles that feature. Beispielsweise wenn Ihre Anwendung die automatische Skalierung, können Sie die automatische Größenänderung-Funktion wie folgt deaktivieren möchten:For example, if your application handles auto scaling, you might want to disable the auto-resizing feature as follows:

<System.Windows.Forms.ApplicationConfigurationSection>
  <add key="DpiAwareness" value="PerMonitorV2" />
  <add key="EnableWindowsFormsHighDpiAutoResizing" value="false" /> 
</System.Windows.Forms.ApplicationConfigurationSection>    

Eine Liste der einzelnen Schlüssel und deren Werte, finden Sie unter hinzufügen Konfigurationselement für Windows Forms.For a list of individual keys and their values, see Windows Forms Add Configuration Element.

Änderungsereignisse für die neue DPI-WertNew DPI change events

Drei neue Ereignisse, die ab .NET Framework 4.7, können Sie programmgesteuerte Behandlung der dynamische DPI-Änderungen:Starting with the .NET Framework 4.7, three new events allow you to programmatically handle dynamic DPI changes:

  • DpiChangedAfterParent, der Fehler wird ausgelöst, wenn die DPI-Einstellung für ein Steuerelement programmgesteuert, nachdem ein DPI-Änderungsereignis für das übergeordnete Steuerelement geändert wird oder Formular auftritt.DpiChangedAfterParent, which is fired when the DPI setting for a control is changed programmatically after a DPI change event for it's parent control or form has occurred.
  • DpiChangedBeforeParent, der Fehler wird ausgelöst, wenn die DPI-Einstellung für ein Steuerelement programmgesteuert, bevor ein DPI-Änderungsereignis für das übergeordnete Steuerelement geändert wird oder Formular auftritt.DpiChangedBeforeParent, which is fired when the DPI setting for a control is changed programmatically before a DPI change event for its parent control or form has occurred.
  • DpiChanged, der Fehler wird ausgelöst, wenn die DPI-Einstellung auf dem Anzeigegerät ändert, in dem das Formular zurzeit angezeigt wird.DpiChanged, which is fired when the DPI setting changes on the display device where the form is currently displayed.

Neue Helper-Methoden und EigenschaftenNew helper methods and properties

.NET Framework 4.7 fügt auch eine Reihe von neuen Helper-Methoden und Eigenschaften, die Aufschluss über die DPI-Skalierung und ermöglichen es Ihnen, führen Sie die DPI-Skalierung.The .NET Framework 4.7 also adds a number of new helper methods and properties that provide information about DPI scaling and allow you to perform DPI scaling. Dazu gehören:These include:

Überlegungen zur VersionskontrolleVersioning considerations

Zusätzlich zu der auf .NET Framework 4.7 und Windows 10 Creators Update ausgeführt wird, kann Ihre Anwendung auch in einer Umgebung ausführen in dem er nicht kompatibel mit hohen DPI-Verbesserungen ist.In addition to running on .NET Framework 4.7 and Windows 10 Creators Update, your application may also run in an environment in which it isn't compatible with high DPI improvements. In diesem Fall müssen Sie einen Fallback für Ihre Anwendung zu entwickeln.In this case, you'll need to develop a fallback for your application. Hierzu können Sie zum Ausführen benutzerdefinierte Zeichnung für die Skalierung.You can do this to perform custom drawing to handle scaling.

Zu diesem Zweck müssen Sie auch das Betriebssystem zu ermitteln, auf dem Ihre app ausgeführt wird.To do this, you also need to determine the operating system on which your app is running. Sie können dies tun, mit den folgenden Code:You can do that with code like the following:

// 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 die Anwendung erfolgreich Windows 10 erkennen wird nicht, wenn es als ein unterstütztes Betriebssystem im Anwendungsmanifest aufgeführt war nicht.Note that your application won't successfully detect Windows 10 if it wasn't listed as a supported operating system in the application manifest.

Sie können auch die Version von .NET Framework überprüfen, denen die Anwendung erstellt wurde:You can also check the version of the .NET Framework that the application was built against:

Console.WriteLine(AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName);

Siehe auchSee also