2008-09-08 50 views
11

因此,我正在閱讀有人在另一個問題中鏈接到的Windows Vista UI準則,他們提到您應該能夠在切換到120 DPI後繼續存在。那麼,我安裝了我的應用程序,啓動了我的方便虛擬機,我們得到了什麼...... AAAAGH !!!大量的UI失敗!字體大小的獨立用戶界面:當我切換到120 DPI時,一切都崩潰了?

一切都是混亂的:有些容器的尺寸不夠大;一些「彼此相鄰」的控件現在都被擠在一起/散開;一些按鈕不夠高;我的ListView列不夠寬... eeek。

這聽起來像一個完全不同的方法是爲了。我之前的一個基本上是使用VS2008 Windows窗體設計器來創建一個基於像素的佈局。我可以看到,如果我堅持使用Windows Forms,FlowLayoutPanel會很有幫助,但我發現它們在過去非常不靈活。它們也不能解決容器(例如形狀本身)不夠大的問題;大概有一種方法可以做到這一點?也許那AutoSize屬性?

這可能也是一個跡象表明是時候跳槽到WPF了;我的印象是專門爲這種事情設計的。

的基本問題似乎歸結爲以下:

  • 如果我堅持使用Windows窗體,什麼是所有的技巧,以實現字體大小無關的佈局,能夠生存的用戶設置自己的字體很大,或者將顯示設置爲120 DPI?
  • WPF是否在這裏有很大的優勢,如果有的話,你能否試圖說服我這是值得的轉換?
  • 對於字體大小無關的佈局,在.NET堆棧中還是一般情況下,是否有任何通用的「最佳實踐」?

回答

11

學習碼頭屬性如何在你的控制工作,離開什麼都可以AutoSize本身,當你可以使用TableLayoutPanel

如果你做了這三件事,你將在Windows Forms中獲得很多WPF設計經驗。精心設計的TableLayoutPanel將盡最大努力確定控件的大小,以便它們適合窗體。結合AutoSize控制,對接和AutoScaleMode由Soeren Kuklau提到,您應該能夠做出一些可以很好地擴展的東西。如果沒有,你的表單可能只是有太多的控制;考慮將其分成標籤頁,浮動工具箱或其他空間。

在WPF中它更容易一些,因爲自動調整大小控件的概念是內置的;在大多數情況下,如果您通過使用座標對來放置WPF元素,那麼您做錯了。不過,你不能改變這樣一個事實,即在較低的分辨率下,它不會佔用太多的120dpi文本來填滿屏幕。有時候問題不在於你的佈局,而在於嘗試將太多空間放在一個小空間中。

+0

我一直使用Anchor,Dock,AutoSize和TableLayoutPanels來實現可翻譯的UI,並導致可調整大小的窗體。但是,在「XP樣式DPI縮放」複選框關閉的情況下,在高DPI設置下,我發現我的每個應用程序都有模糊的字體。任何提示修復? – 2009-10-24 08:54:19

4

如果我堅持使用Windows窗體,什麼是所有的技巧,以實現字體大小無關的佈局,可生存的用戶設置自己的字體較大,或將顯示,以120 DPI?

首先,AutoScaleMode可能是你的朋友。

4

一般來說,問題在於使用兩種不同的「常數」進行表單佈局,然後更改其中一個常量而不更改其他參數。

您使用的像素爲您的表單實體,並指向(基本上英寸)來指定字體大小。像素和點與DPI相關,因此您更改了DPI,突然您的像素固定值與您的點固定值不一致。

這裏有一些包和類,但是在一天結束時您必須選擇一個單元或另一個單元,或者根據不斷變化的常量縮放其中一個單元。

就個人而言,我會將窗體上的實體更改爲英寸。我不是C#人員,所以我不知道這是否是本地支持的,或者如果您必須在應用程序啓動時執行一些動態表單大小調整。

如果您必須在您的軟件中執行此操作,請繼續並正常調整所有內容(例如,按照通常的96 DPI)。

當您的應用程序啓動時,請在顯示錶單之前驗證系統是否爲96 DPI。如果是,那很好。如果不是,則在顯示錶單之前,用修正係數設置一個變量,並對每個實體進行縮放和平移(修改位置和大小)。

但是,最終的目標是以英寸或點數(點數爲1/72英寸)來指定所有內容,並讓操作系統處理它。您可能需要處理的情況(室外屏幕,正確設置DPI會顯示幾個像素您的應用程序...)