論wpf的設(shè)備無(wú)關(guān)性

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é)本身也是一件很愉快的事情玖院。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末菠红,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子难菌,更是在濱河造成了極大的恐慌试溯,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郊酒,死亡現(xiàn)場(chǎng)離奇詭異遇绞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)燎窘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)摹闽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人褐健,你說(shuō)我怎么就攤上這事付鹿。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵倘屹,是天一觀的道長(zhǎng)银亲。 經(jīng)常有香客問(wèn)我,道長(zhǎng)纽匙,這世上最難降的妖魔是什么务蝠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮烛缔,結(jié)果婚禮上馏段,老公的妹妹穿的比我還像新娘。我一直安慰自己践瓷,他們只是感情好院喜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著晕翠,像睡著了一般喷舀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淋肾,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天硫麻,我揣著相機(jī)與錄音,去河邊找鬼樊卓。 笑死拿愧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碌尔。 我是一名探鬼主播浇辜,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼唾戚!你這毒婦竟也來(lái)了柳洋?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤颈走,失蹤者是張志新(化名)和其女友劉穎膳灶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體立由,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轧钓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锐膜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毕箍。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖道盏,靈堂內(nèi)的尸體忽然破棺而出而柑,到底是詐尸還是另有隱情文捶,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布媒咳,位于F島的核電站粹排,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏涩澡。R本人自食惡果不足惜顽耳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妙同。 院中可真熱鬧射富,春花似錦、人聲如沸粥帚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芒涡。三九已至柴灯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拖陆,已是汗流浹背弛槐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留依啰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓店枣,卻偏偏與公主長(zhǎng)得像速警,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸯两,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容