Windows Forms 中的高 DPI 支援

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

  • 針對數項 Windows Forms 控制項的縮放及配置功能 (例如 MonthCalendar 控制項與 CheckedListBox 控制項) 進行改進。

  • 單次縮放。 在 .NET Framework 4.6 和更早版本中,縮放是分成多次執行的,這導致部分控制項的縮放超出必要範圍。

  • 支援動態 DPI 案例,在 Windows Forms 應用程式啟動之後,使用者可用以變更 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 4.7 起的 .NET Framework 版本所支援的所有高 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 新增組態元素

新的 DPI 變更事件

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

  • DpiChangedAfterParent,若在某個控制項的父控制項或表單發生 DPI 變更事件之後,以程式設計方式變更了其 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 未在應用程式資訊清單中列為支援的作業系統,應用程就不會成功偵測到 Windows 10。

您也可以檢查據以建置應用程式的 .NET Framework 版本:

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

另請參閱