其實這一篇文章的內容,應該是跟上一篇一起發布的,但是由於這個更多的是與UI相關的知識,因此單獨開辟了一篇來寫。
寫過Winform的人都知道Winform中對寬高的定義都是整形的,也就是說 不允許出現小數,這是為什么呢?
答案很簡單:Winform中寬高的單位是像素(px),而像素是顯示圖像的基本單位,不可再分割,因此只能是整形。
使用像素決定應用的寬高比,會存在什么缺陷呢?
以像素為單位決定寬高比的情況下,當你調整顯示器分辨率時候,應用程序的大小就會發生變化。例如一個大小是1024x768的應用程序,如果把系統分辨率調成800*600會怎么樣?很明顯,這個程序會占用整個屏幕,還顯示不全。Winform的應用程序就會發生這種牛逼的問題
在WPF中,引入了一個新的概念 邏輯像素(logic pixel),又叫設備無關像素(device-independent pixel)。
我們來看下它的定義
1 邏輯像素=1/96 英寸
看到了么?這貨是以英寸為單位的!所以當你設置 Window的Width=96 Height=96時 你會獲取到一個1*1英寸的窗口,有興趣的可以拿尺子量一下。因此無論你如何調整分辨率,它都是1X1英寸的大小,所以你看到的窗體大小是固定的。
邏輯像素跟像素又是怎么個關系呢?是怎么換算的呢?
默認情況下,顯示器默認每英寸的有96個像素 也就是96DPI, 這時候 Width=96 Height=96 窗體對應的像素也是96PX*96PX
如果手賤調整為了120DPI 表示顯示器每英寸有120個像素, 這時候Width=96 Height=96 窗體對應的像素是120PX*120PX
看到了么? 邏輯像素 只認英寸,而且當顯示器調整其每英寸像素數量的時候 邏輯像素向像素的轉換也會自動增加像素比,就是這樣,這個猥瑣的單位保證了窗體的顯示大小不變。這是為什么WPF中長與寬的單位允許小數點的存在,因為這是英寸,不是最小單位像素。同理這也是為什么Win8和WP7選擇Xaml作為展示的原因!
扯遠了……
以上就是邏輯像素的基本概念,下面我們來看看系統提供的一些默認值,這些默認值封裝在System.Windows.WindowParameters中,其中大部分值都是以邏輯像素為單位,但是有兩個特例,WindowParameters.SmallIconHeight 與 WindowParameters.SmallIconWidth這兩個屬性是以像素為單位的,因為圖標的單位大家也都熟悉 16px X 16px 32px X 32px等
Tips:
邏輯像素雖然是以英寸為單位,但是不會100%的精確,這是由於系統原因與顯示器硬件等原因造成的,但是整體來說屏蔽了由於分辨率修改造成的窗體大小變化問題。邏輯像素這個概念會在UI展示中經常遇到,因此要牢記。