ModernUI教程:獨立顯示器DPI感知

聖光下的囚徒發表於2016-04-10

         獨立顯示器DPI感知,是在Windows 8.1中新增的特性,這個特性針對擁有多個顯示器同時各個顯示器的DPI設定又不同的人。對這個新特性做了優化支援的軟體能夠在一個高DPI的顯示器移動視窗到另一個低DPI的顯示器的時候實現完美自適應,反之亦然,自動適應對應的顯示器的DPI。而對於不支援這個新特性的軟體,哪怕是已經針對DPI調整做了優化的軟體,系統都會利用DPI虛擬化來對軟體介面進行畫素拉伸放大或縮小(實際上放大與縮小採取了2種不同的方式,具體我就不說了),從而適應不同顯示器的DPI。

 

支援:

        在Windows 8.1之前,獨立顯示器DPI感知並不存在,作業系統提供了一個系統DPI,WPF自動支援。
        在1.0.6版本以後,當作業系統支援時,Modern UI將會自動啟用獨立顯示器DPI感知功能。新基類DpiAwareWindow實現了所有擴充套件到當前顯示器DPI設定所必需的功能。ModernWindow和ModernDialog都派生自DpiAwareWindow。

要求:

ModernUI應用程式支援獨立顯示器DPI感知有兩個要求:
1、顯然主機作業系統必須是Windows 8.1或更高版本。如果ModernUI應用程式執行的作業系統不支援獨立顯示器DPI感知,它就會自動轉切換到SystemDPI感知,這是WPF的預設設定。
2、為了在程式中啟用PerMonitorDpiAwareness,它必須被初始化為DPI unaware。這可以通過在你的應用程式中新增以下程式碼到AssemblyInfo.cs來實現:

image

DPI API:

ModernUI公開的API可以用來查詢當前的DPI設定。

DpiAwareWindow

DpiInformation屬性
公開當前的DPI settings.

DpiChanged事件和OnDpiChanged方法
當螢幕上的DPI 設定發生改變時被渲染。重寫OnDpiChanged或處理DpiChanged事件來監視DPI的變化。例如你可以載入高/低DPI影象資源。

ModernUIHelper
包含輔助方法用於獲取和設定當前程式的DPI感知。


GetDpiAwereness方法
查詢當前程式的DPI掛不照顧。返回DpiUnaware,SystemDpiAware或PerMonitorDpiAware


TrySetPerMonitorDpiAware方法
試圖設定DPI感知為PerMonitorDpiAware。當主機作業系統不支援PerMonitorDpiAware時,將採用SystemDpiAware。程式中最初的DPI感知必須成功設定為DpiUnaware。任何失敗的操作都會被丟棄,返回值標識操作是否成功。
該方法由DpiAwareWindow內部使用,不需要顯式地呼叫這個方法。

ModernUI的獨立顯示器DPI感知的實現很大程度上是基於MSDN上的文章:開發一個Per-Monitor DPI-Aware WPF應用程式

傳送門:ModernUI教程:目錄

相關文章