WPF從發(fā)布之日起在塔,一直將“分辨率無(wú)關(guān)(resolution independence)”作為其亮點(diǎn)影暴,聲稱(chēng)使用WPF制作的用戶(hù)界面在輕巧的Ultra-Mobile PC的屏幕上和在50英寸的電視機(jī)上都能很好地顯示玖喘。微軟之所以稱(chēng)WPF具備“分辨率無(wú)關(guān)”這一特性,主要是因?yàn)閃PF的坐標(biāo)單位設(shè)計(jì)成為以1/96英寸為一個(gè)邏輯像素單位馆里,而不是與設(shè)備相關(guān)的像素單位。
但是微軟本身對(duì)WPF“分辨率無(wú)關(guān)”這一特性沒(méi)有作更多的具體解釋?zhuān)瑢?dǎo)致用戶(hù)會(huì)產(chǎn)生很多誤解栈雳。
誤解之一
改變顯示器的分辨率設(shè)置,同一個(gè)WPF的用戶(hù)界面和繪制的圖形尺寸不會(huì)變化泡嘴。
這個(gè)可以用一個(gè)非常簡(jiǎn)單的實(shí)驗(yàn)證明該結(jié)論是錯(cuò)誤的甫恩。新建一個(gè)WPF應(yīng)用程序窗口逆济,其中高度為400DIUs(DIU:Device independent unit酌予,設(shè)備無(wú)關(guān)單位),寬度為600DIUs奖慌,讓這個(gè)窗口分別在分辨率設(shè)置為1280 * 1024和800*600的環(huán)境下運(yùn)行抛虫,如下圖所示,兩個(gè)窗口的尺寸是明顯不一樣的简僧。
圖?1?左圖為1280 * 1024分辨率建椰,右圖為800*600分辨率
誤解之二
改變顯示的DPI設(shè)置,同一個(gè)WPF的用戶(hù)界面和繪制的圖形尺寸不會(huì)變化岛马。
顯示的DPI設(shè)置棉姐,在XP系統(tǒng)下是通過(guò)右鍵——屬性——設(shè)置選項(xiàng)卡——高級(jí),可以調(diào)用出來(lái)啦逆,如下圖所示:
圖?2?顯示屬性DPI設(shè)置
這個(gè)也可以用同樣的方法進(jìn)行證明該結(jié)論是錯(cuò)誤的伞矩。仍然是高度為400DIUs[1],寬度為600DIUs的窗口分別運(yùn)行在96DPI和192DPI兩種設(shè)置環(huán)境下夏志。從下圖也可以明顯看出窗口的尺寸是不一樣的乃坤。
圖?3?左圖為96DPI,右圖為192DPI
在不同屏幕上沟蔑,如果DPI設(shè)置相同湿诊,則同一個(gè)WPF的用戶(hù)界面和繪制的圖形尺寸不會(huì)變化。
在這個(gè)地方有必要對(duì)屏幕的DPI設(shè)置進(jìn)行一下解釋說(shuō)明瘦材。DPI設(shè)置是指屏幕上每英寸多少個(gè)像素厅须,比如當(dāng)前設(shè)置為96DPI,即屏幕上96個(gè)像素為1英寸食棕。一般的Windows XP系統(tǒng)有正常尺寸(96DPI)朗和、大尺寸(120DPI)和自定義尺寸三種選項(xiàng)。既然WPF的坐標(biāo)單位是以1/96英寸為一個(gè)邏輯像素單位宣蠕,那么我們有理由相信例隆,如果兩個(gè)顯示器的DPI設(shè)置是相同的,那么同一個(gè)WPF的用戶(hù)界面和繪制的圖形尺寸不會(huì)變化抢蚀。很遺憾镀层,這樣的結(jié)論依舊是一個(gè)錯(cuò)誤。
CalvinP.Schrotenboer?也用一個(gè)實(shí)驗(yàn)證明這是一個(gè)錯(cuò)誤。實(shí)驗(yàn)環(huán)境如表 1唱逢,比如桌面LCD顯示器實(shí)際屏幕寬度和高度(像素單位)為1600 x 1200吴侦,這個(gè)和普通的分辨率設(shè)置需要區(qū)分,這是顯示設(shè)備的最大分辨率或者說(shuō)是物理分辨率坞古,即物理上該顯示器屏幕上是1600 x 1200個(gè)像元备韧,英文中又稱(chēng)這種分辨率為“native resolution(原生分辨率)”。由于兩個(gè)屏幕物理尺寸也不一樣痪枫,所以實(shí)際的物理DPI可以通過(guò)表中的計(jì)算公式得到织堂。實(shí)際的物理DPI和操作系統(tǒng)的DPI設(shè)置是沒(méi)有什么聯(lián)系的。
表?1實(shí)驗(yàn)環(huán)境
在兩個(gè)不同系統(tǒng)當(dāng)中運(yùn)行同一個(gè)WPF應(yīng)用程序奶陈,該程序了繪制了一條長(zhǎng)為384DIUs的直線易阳,換算成英寸即為384/96= 4英寸。結(jié)果在兩個(gè)系統(tǒng)當(dāng)中的實(shí)際尺寸如下圖所示:
圖?4?上圖實(shí)際尺寸為4.08英寸吃粒,下圖實(shí)際尺寸為3.28英寸(CalvinP.Schrotenboer,2006)
問(wèn)題出在哪兒了潦俺?
其實(shí)從表 1當(dāng)中就能看出一些端倪,原因正是在于實(shí)際的物理DPI和操作系統(tǒng)設(shè)置的DPI不一致造成的徐勃。WPF無(wú)法知道當(dāng)前使用設(shè)備實(shí)際的物理DPI為多少事示,相反通過(guò)操作系統(tǒng)的API函數(shù)獲得操作系統(tǒng)的DPI值,然后簡(jiǎn)單地認(rèn)為這就是實(shí)際的物理DPI值僻肖。比如在桌面LCD顯示器上肖爵,實(shí)際一個(gè)物理像元的尺寸為1/94英寸,由于操作系統(tǒng)設(shè)置為96DPI檐涝,因此WPF還固執(zhí)地以為一個(gè)實(shí)際的像元為1/96英寸遏匆,因此線段長(zhǎng)度為1/94 * 384 = 4.08英寸。筆記本顯示器實(shí)際一個(gè)物理像元的尺寸為1/117英寸谁榜,因此線段長(zhǎng)度為1/117 * 384 = 3.28英寸幅聘。這個(gè)值和我們測(cè)量的結(jié)果正好相符。
那么我們有理由推測(cè)窃植,如果將操作系統(tǒng)的DPI設(shè)置成實(shí)際的物理DPI帝蒿,則能做到真正的“分辨率獨(dú)立”,即在兩個(gè)不同顯示器上顯示的線段長(zhǎng)度都為4英寸巷怜,如圖 5所示:
圖?5?左圖為桌面LCD顯示器葛超,將DPI設(shè)置成為94,右圖為筆記本顯示器延塑,將DPI設(shè)置成為117
WPF的“分辨率無(wú)關(guān)”到現(xiàn)在為止已經(jīng)是山高月小绣张,水落石出。那么我們還要接著討論另一個(gè)問(wèn)題关带,在顯示器上存在這樣的問(wèn)題侥涵,那么是否在打印機(jī)上也存在這樣的問(wèn)題呢?仍然可以用一個(gè)實(shí)驗(yàn)證明。同樣繪制一個(gè)4英寸的直線芜飘,分別在DPI設(shè)置為96DPI和120DPI下進(jìn)行打印务豺,得到的打印結(jié)果尺寸相同。如下圖所示:
圖?6?左圖為系統(tǒng)設(shè)置120DPI下打印結(jié)果嗦明,右圖為系統(tǒng)設(shè)置96DPI下打印結(jié)果
結(jié)論
通過(guò)上面幾個(gè)實(shí)驗(yàn)分析笼沥,我們可以得到如下兩個(gè)結(jié)論:
(1)??????????????WPF在打印得時(shí)候可以做到“分辨率無(wú)關(guān)”,即同一個(gè)WPF用戶(hù)界面和繪制的圖形尺寸在任何一臺(tái)打印機(jī)上輸出都是一致的娶牌;
(2)??????????????當(dāng)顯示器實(shí)際象元的物理尺寸和系統(tǒng)設(shè)置的DPI保持一致的時(shí)候奔浅,WPF可以在顯示器上做到“分辨率無(wú)關(guān)”,即同一個(gè)WPF用戶(hù)界面和繪制的圖形尺寸在任何一臺(tái)顯示器(實(shí)際象元的物理尺寸和系統(tǒng)設(shè)置的DPI保持一致)上輸出都是一致的裙戏。反之則無(wú)法保證乘凸。
更多的討論
“分辨率無(wú)關(guān)”這樣一個(gè)概念,由于微軟本身討論得不多累榜,的確容易造成誤解。最為詳細(xì)地討論了WPF當(dāng)中“分辨率無(wú)關(guān)”的是CalvinP.Schrotenboer 的一篇博文“Is WPF Really Resolution Independent?”灵嫌。當(dāng)然Charles Peztold也在自己的博客當(dāng)中討論過(guò)這個(gè)問(wèn)題壹罚。另外在微軟的論壇上StephenW,Charles Peztold等人也就WPF的“分辨率無(wú)關(guān)”和“設(shè)備無(wú)關(guān)”作了比較深入的討論寿羞。
用戶(hù)固然可以不理睬這些猖凛,但是對(duì)于一個(gè)程序員來(lái)說(shuō),尤其是一個(gè)正在做繪圖程序的程序員绪穆,尤其尤其是一個(gè)還需要打印輸出的繪圖程序員辨泳,是需要清楚這其中細(xì)節(jié)的。而且了解細(xì)節(jié)本身也是一件很愉快的事情玖院。