Richten Sie Ihre Anwendung auf .Net Framework 4.7 aus und führen Sie sie unter Windows 10 v1703 aus (Creators Update Build 15063). Mit .Net 4.7 unter Windows 10 (v1703) hat MS viele DPI-Verbesserungen vorgenommen .
Ab .NET Framework 4.7 enthält Windows Forms Verbesserungen für gängige Szenarien mit hoher und dynamischer DPI. Diese beinhalten:
Verbesserungen bei der Skalierung und dem Layout einer Reihe von Windows Forms-Steuerelementen, z. B. des MonthCalendar-Steuerelements und des CheckedListBox-Steuerelements.
Single-Pass-Skalierung. In .NET Framework 4.6 und früheren Versionen wurde die Skalierung über mehrere Durchgänge durchgeführt, wodurch einige Steuerelemente mehr als erforderlich skaliert wurden.
Unterstützung für dynamische DPI-Szenarien, in denen der Benutzer den DPI- oder Skalierungsfaktor nach dem Start einer Windows Forms-Anwendung ändert.
Fügen Sie Ihrer Anwendung ein Anwendungsmanifest hinzu und signalisieren Sie, dass Ihre App Windows 10 unterstützt:
<compatibility xmlns="urn:schemas-microsoft.comn:compatibility.v1">
<application>
<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
Fügen Sie als Nächstes eine hinzu app.config
und deklarieren Sie die App Per Monitor Aware. Dies geschieht JETZT in app.config und NICHT wie zuvor im Manifest!
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
Dieser PerMonitorV2 ist seit dem Windows 10 Creators Update neu:
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
Wird auch als Per Monitor v2 bezeichnet. Eine Weiterentwicklung des ursprünglichen DPI-Erkennungsmodus pro Monitor, mit dem Anwendungen auf Fensterbasis der obersten Ebene auf neue DPI-bezogene Skalierungsverhalten zugreifen können.
Benachrichtigungen über untergeordnete Fenster-DPI-Änderungen - In Per Monitor v2-Kontexten wird der gesamte Fensterbaum über alle auftretenden DPI-Änderungen benachrichtigt.
Skalierung des Nicht-Client-Bereichs - In allen Fenstern wird der Nicht-Client-Bereich automatisch DPI-sensitiv gezeichnet. Aufrufe von EnableNonClientDpiScaling sind nicht erforderlich.
S caling von Win32 - Menüs - Alle NTUSER Menüs in Pro - Monitor v2 Kontexte geschaffen wird in einer Pro-Monitor Mode werden die Skalierung.
Dialogskalierung - Win32-Dialoge, die in Per Monitor v2-Kontexten erstellt wurden, reagieren automatisch auf DPI-Änderungen.
Verbesserte Skalierung von comctl32-Steuerelementen - Verschiedene comctl32-Steuerelemente haben das DPI-Skalierungsverhalten in Per Monitor v2-Kontexten verbessert.
Verbessertes Theming-Verhalten - UxTheme-Handles, die im Kontext eines Per Monitor v2-Fensters geöffnet wurden, werden in Bezug auf die diesem Fenster zugeordnete DPI ausgeführt.
Jetzt können Sie 3 neue Ereignisse abonnieren, um über DPI-Änderungen informiert zu werden:
Control.DpiChangedAfterParent , das ausgelöst wird Tritt auf, wenn die DPI-Einstellung für ein Steuerelement programmgesteuert geändert wird, nachdem ein DPI-Änderungsereignis für das übergeordnete Steuerelement oder Formular aufgetreten ist.
Control.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.
Form.DpiChanged , das ausgelöst wird, wenn sich die DPI-Einstellung auf dem Anzeigegerät ändert, auf dem das Formular derzeit angezeigt wird.
Sie haben auch 3 Hilfsmethoden zur Behandlung / Skalierung von DPI:
Control.LogicalToDeviceUnits , das einen Wert von logischen in Gerätepixel konvertiert.
Control.ScaleBitmapLogicalToDevice , das ein Bitmap-Image auf die logische DPI eines Geräts skaliert.
Control.DeviceDpi , das die DPI für das aktuelle Gerät zurückgibt.
Wenn weiterhin Probleme auftreten, können Sie die DPI-Verbesserungen über app.config-Einträge deaktivieren .
Wenn Sie keinen Zugriff auf den Quellcode haben, können Sie die Anwendungseigenschaften im Windows Explorer aufrufen, zur Kompatibilität wechseln und auswählen System (Enhanced)
Hiermit wird die GDI-Skalierung aktiviert, um auch die DPI-Verarbeitung zu verbessern:
Für Anwendungen, die GDI-basiert sind, kann Windows diese jetzt pro Monitor DPI-skalieren. Dies bedeutet, dass diese Anwendungen auf magische Weise DPI-fähig werden.
Wenn Sie all diese Schritte ausführen, sollten Sie eine bessere DPI-Erfahrung für WinForms-Anwendungen erhalten. Denken Sie jedoch daran, dass Sie Ihre App auf .net 4.7 ausrichten müssen und mindestens Windows 10 Build 15063 (Creators Update) benötigen. Im nächsten Windows 10 Update 1709 werden wir möglicherweise weitere Verbesserungen erhalten.
NumericUpDown
skaliert es auch nichtMargin
richtig. Es scheint, dass der Rand zweimal skaliert ist. Wenn ich es einmal verkleinere, sieht es gut aus.