WPF 對應不同DPI時視窗位置調整

2022-01-24 09:11:20 字數 894 閱讀 7132

最近在做乙個專案,需要視窗依附於令乙個元素,顯示在他的上面,或者是下面。我這裡又不能用popup,只能用視窗了, 所以呢,在100%dpi的時候,我的視窗顯示都沒有問題,但是當把dpi調成125%或者更高的時候,問題就來了。

高dpi下,發現我的視窗不見了。有的時候會出來,但是移動它依附的元素的時候,視窗又不知所蹤了。

經過我多次嘗試,修改dpi後,並不是所有的尺寸相關的東西都要針對dpi做相應的處理。

關於dpi的介紹,下面這位大神介紹的比較清晰了已經:

我這裡要解釋的其實是電腦裡面設定的dpi,其實是改變了原來每個點的大小,也就是如果dpi調到125%,那麼每個點的大小是原來的1.25倍,這樣每英吋下的點數其實是減少了的,是原來的96/125個,但是wpf視窗不會減少點數來顯示,所以dpi增大後,wpf視窗其實是變大的,這個微軟給我們做了處理,不用我們來做額外的工作。

同理如果我們手動將視窗固定到了某個位置,在高dpi下,這個位置(x,y)距離視窗左上角的距離是被放大的,即原來的400,在125%下是500,所以,如果我們還想讓視窗顯示在我們想要的位置,這時就要對(x, y)做不同於視窗放大的反應了,也就是說高dpi時,我們的視窗放大了,這時我們反而要將(x, y)變小,也就是減少視窗距離螢幕左上角的畫素數,變成(x/1.25,  y/1.25),這樣才能保證視窗的位置在螢幕上是不變的,只是改變了視窗的大小。

以下是獲取系統dpi的方法:

graphics g = graphics.fromhwnd(intptr.zero); g.dpix  和 g.dpiy   就是系統的dpi。

獲取dpi的方法,還有很多種,大家都可以在網上找到。

關於這個其實我還有個疑問,就是我改變dpi後,我的wpf程式不能實時獲取到最新的dpi,必須要重新啟動系統,才能獲取到正確的dpi,關於這個問題,大家如果有實現的方法,望不吝賜教

WPF中DPI 的問題

最近處理了乙個關於dpi的問題,想想挺有意思的,拿出來分享一下。先搞清楚一下幾個概念 dpi解析度 如上例,但是我們常說調整一下顯示器的解析度,是啥意思呢?顯示器有乙個自然的解析度,就是顯示器的最大能耐,比如說,顯示器的自然解析度為1600 1200,那麼長度小於1600 寬度小於1200的解析度都...

CentOSo對應不同版本的描述

0 readme.txt 05 apr 2013 11 10 1410 centos 6.4 i386 livecd.iso 02 may 2013 14 13 730857472 centos 6.4 i386 livecd.torrent 22 may 2013 16 54 28504 cent...

WPF 動畫 同為控制項不同命

讀大學的時候,有一門課的作業是用 ppt 展示。但是我們很多同學都把 ppt 當做 word 來用,就單純地往裡面堆文字。大家都單純地從一頁堆積的文字翻到另一頁堆積的文字,以致於台下的同學都聽不下去,包括那些以同樣的方式匯報的同學。本來以為會在枯燥中期待下課的到來,直到有個叫幽靈東的同學匯報,他驚豔...