Windows Forms 中的高 DPI 支援

從 .NET Framework 4.7 開始,Windows Forms 包含常見高 DPI 和動態 DPI 案例的增強功能。 包括:

  • 改善許多 Windows Forms 控制項的縮放和配置,例如 MonthCalendar 控制項和 CheckedListBox 控制項。

  • 單一傳遞調整。 在 .NET Framework 4.6 和舊版中,調整是透過多個階段執行,這會導致某些控制項調整超過必要。

  • 支援在 Windows Forms 應用程式啟動之後,使用者變更 DPI 或縮放比例的動態 DPI 案例。

從 .NET Framework 4.7 開始的 .NET Framework 版本中,增強的高 DPI 支援是加入宣告功能。 您必須將應用程式設定為利用它。

設定 Windows Forms 應用程式以支援高 DPI

支援高 DPI 感知的新 Windows Forms 功能僅適用于以 .NET Framework 4.7 為目標且從 Windows 10 Creators Update 開始在 Windows 作業系統上執行的應用程式。

此外,若要在 Windows Forms 應用程式中設定高 DPI 支援,您必須執行下列動作:

  • 宣告與 Windows 10 的相容性。

    若要這樣做,請將下列內容新增至您的資訊清單檔案:

    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
      <application>
        <!-- Windows 10 compatibility -->
        <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
      </application>
    </compatibility>
    
  • 在 app.config 檔案中 啟用個別監視器 DPI 感知。

    Windows Forms 引進了新的 <System.Windows.Forms.ApplicationConfigurationSection> 元素,以支援從 .NET Framework 4.7 開始新增的新功能和自訂專案。 若要利用支援高 DPI 的新功能,請將下列內容新增至您的應用程式組態檔。

    <configuration>
      <!-- ... other xml settings ... -->
    
      <System.Windows.Forms.ApplicationConfigurationSection>
        <add key="DpiAwareness" value="PerMonitorV2" />
      </System.Windows.Forms.ApplicationConfigurationSection>
    
    </configuration>
    

    重要

    在舊版 .NET Framework 中,您使用資訊清單來新增高 DPI 支援。 不再建議使用此方法,因為它會覆寫 app.config 檔案上定義的設定。

  • 呼叫靜態 EnableVisualStyles 方法。

    這應該是應用程式進入點中的第一個方法呼叫。 例如:

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

退出宣告個別的高 DPI 功能

DpiAwareness將 值設定為 PerMonitorV2 可啟用 .NET Framework 版本從 .NET Framework 4.7 開始支援的所有高 DPI 感知功能。 一般而言,這適用于大部分的 Windows Forms 應用程式。 不過,您可能想要退出宣告一或多個個別功能。 執行這項操作最重要的原因是,您現有的應用程式程式碼已經處理該功能。 例如,如果您的應用程式處理自動調整,您可能會想要停用自動調整大小功能,如下所示:

<configuration>
  <!-- ... other xml settings ... -->

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

</configuration>

如需個別索引鍵及其值的清單,請參閱 Windows Forms Add Configuration Element

新的 DPI 變更事件

從 .NET Framework 4.7 開始,有三個新事件可讓您以程式設計方式處理動態 DPI 變更:

  • DpiChangedAfterParent,這是在控制項的父控制項或表單發生 DPI 變更事件之後,以程式設計方式變更控制項時引發的。
  • DpiChangedBeforeParent,當控制項的 DPI 設定在發生其父控制項或表單的 DPI 變更事件之前,以程式設計方式變更時引發。
  • DpiChanged,這是在目前顯示表單的顯示裝置上變更 DPI 設定時引發的。

新的協助程式方法和屬性

.NET Framework 4.7 也會新增許多新的協助程式方法和屬性,以提供 DPI 縮放的相關資訊,並可讓您執行 DPI 縮放。 包括:

版本控制考慮

除了在 .NET Framework 4.7 和 Windows 10 Creators Update 上執行,您的應用程式也可以在與高 DPI 改善不相容的環境中執行。 在此情況下,您必須為應用程式開發後援。 您可以執行此動作以執行 自訂繪圖 來處理縮放。

若要這樣做,您也需要判斷應用程式執行所在的作業系統。 您可以使用如下所示的程式碼來執行此動作:

// 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));

請注意,如果您的應用程式未在應用程式資訊清單中列為支援的作業系統,則無法成功偵測 Windows 10。

您也可以檢查已針對下列專案建置應用程式的 .NET Framework 版本:

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

另請參閱