2010-03-15 59 views
7

我的.NET應用程序(VB.NET 3.5,如果你真的必須知道)表單在高DPI設置下渲染時不能正確格式化。到目前爲止,我發現的所有修復都只是將問題的原因解釋爲「某些UI元素無法正確縮放」。我想知道是否有人有更有意義的解釋?謝謝!爲什麼.NET winforms在大DPI設置下不能正確縮放?

回答

10

基本上問題是GDI +(以及擴展名爲Windows窗體)使用設備像素作爲其默認測量單位。當您更改DPI設置時,像素的物理尺寸實際上並未發生變化(像素是像素),但以非像素尺寸測量的字體和圖像會相應縮放。 Windows Forms試圖儘可能地適應這一點,通過爲佈局騰出更多空間,但唯一真正的解決方案是始終使用基於非像素的測量系統。這就是WPF所做的。

在WPF中,在96 DPI時,與設備無關的像素與物理像素的大小相同。但是,當您更改系統的DPI時,WPF會在全局範圍內調整虛擬座標系。應用程序,控件等都不知道它們不再與物理像素對齊。實際上,這有時會導致WPF中出現鋸齒問題,但幾乎不用擔心在不同的DPI設置中應用程序的佈局不同。

你可以做的一件事是儘量減少Windows窗體中的問題,就是使用「new」(如.NET 2.0)佈局面板,如TableLayoutPanel,FlowLayoutPanel等。儘可能使用Anchor,Dock和AutoSize。這將允許Windows窗體儘可能迴流您的UI。

還要注意,如果您在非標準DPI上創建窗體,Windows窗體將使用此作爲「基本」大小。它幾乎總是把事情搞砸。所以嘗試使用96 DPI來設計你的表格。