2013-11-20 27 views
1

我已經構建了一個WPF應用程序,該應用程序具有可停靠到桌面邊緣的窗口。我使用SHAppBarMessage WIN32 API來執行對接功能。Windows 8.1中的TransformToDevice轉換是否隨DPI設置而變化?

在Windows 8.1中,我注意到當停靠時,窗口只保留了它需要的一半寬度。我的代碼從被停靠的窗口中PresentationSource對象,然後獲取TransformToDevice Matrix對象:

PresentationSource source = PresentationSource.FromVisual(window); 
Matrix TransformToDevice = source.CompositionTarget.TransformToDevice; 

我然後使用Matrix計算區域的大小在桌面上之前轉換窗口的ActualHeightActualWidth到設備座標保留的窗口:只要顯示器處於100%DPI模式

Size windowSize = (Size) source.CompositionTarget.TransformToDevice.Transform(new Vector(appbarWindow.ActualWidth, appbarWindow.ActualHeight)); 

所有這些代碼的工作,但是當你的DPI設置更改問題上升。在更高的DPI設置(即DPI> 100%)中,桌面上爲窗口保留的區域比窗口窄。

在我的調試中,我在計算上述窗口大小的行上放置了一個斷點。我發現在100%DPI設置中,變換Matrix是標識矩陣。但更改DPI設置後,Matrix保持不變!

我認爲如果DPI設置改變,這個變換矩陣會改變嗎?如果他們不這樣做,我如何獲得DPI設置生效的轉換?有沒有一種方法可以在DPI設置更改時調用?如果是這樣,我如何獲得DPI設置更改的通知?我有在SystemEvents.DisplaySettingsChanged事件發生時調用的代碼,並且在DPI設置更改時它會被調用。但轉換始終是Identity Matrix。他們不應該改變嗎?我如何獲得正確的變換矩陣?

+0

難道我的答案在http://stackoverflow.com/questions/2236173/screen-resolution-problem-in-wpf/3042339#3042339有幫助嗎?我使用TransformToDevice()來獲取DPI值,它們與PrimaryScreenHeight和PrimaryScreenWidth值相乘。 – JeffFerguson

+0

您使用的代碼與我的相似。問題是矩陣中的值不隨DPI更改而變化。 –

回答

0

我發現我的問題的簡短答案是「不」。 Windows 8.1添加了一種新的DPI感知,稱爲每監視器DPI感知。 WPF代碼不是每個監視器都可以識別DPI。事實證明,您必須根據WPF內置的系統DPI認知度來處理每個監視器的DPI認知。

相關問題