自動調整 (Windows Forms .NET)
自動調整可讓表單及其控件,設計於具有特定顯示器解析度或字型的一部計算機上,以不同的顯示解析度或字型,適當地顯示在另一部計算機上。 如此可確保表單和其控制項利用智慧方式調整大小,以便與使用者和其他開發人員電腦上的原生視窗和其他應用程式保持一致。 相較於每個用戶電腦上的原生 Windows 應用程式,自動調整和可視化樣式可讓 Windows Forms 應用程式維持一致的外觀與風格。
在大多數情況下,自動調整在 Windows Forms 中如預期般運作。 不過,字型配置變更可能會有問題。
需要自動調整
如果沒有自動縮放功能,專為某種顯示解析度或字型所設計的應用程式會在該解析度或字型變更時,看起來太小或太大。 例如,如果應用程式在設計時使用新細明體 9 點做為基準,然後未經調整便在系統字型為新細明體 12 點的電腦上執行,則會看起來太小。 文字項目 (例如標題、功能表、文字方塊內容等) 的顯示將會比其他應用程式還要小。 此外,含有文字之使用者介面 (UI) 項目 (例如標題列、功能表和許多控制項) 的大小會取決於所使用的字型。 在這個範例中,這些項目看起來也會相對較小。
當應用程式是專為特定顯示解析度而設計時,就會發生類似的情況。 最常見的顯示器解析度是每英吋 96 點 (DPI),等於 100% 的顯示器縮放比例,但更高的解析度顯示器支援 125%、150% 、200% (分別等於 120、144 和 192 DPI)和更新版本變得越來越常見。 如果未經調整,專為某種解析度所設計的應用程式 (特別是圖形應用程式) 以另一種解析度執行時,便會看起來太大或太小。
自動縮放會根據相對字型大小或顯示解析度自動調整表單及其子控件的大小,以解決這些問題。 Windows 作業系統支援使用稱為對話方塊單位的相對測量單位,來自動縮放對話方塊。 對話方塊單位是以系統字型以及其與像素的關聯性為依據,並可透過 Win32 SDK 函式 GetDialogBaseUnits
來判斷。 當使用者變更 Windows 所使用的佈景主題時,所有對話方塊都會隨著自動調整。 此外,Windows Forms 支援根據預設系統字型或顯示解析度自動調整。 您可以選擇性地停用應用程式中的自動縮放功能。
警告
不支援 DPI 和字型縮放模式的任意混合。 雖然您可以使用某種模式 (例如 DPI) 縮放使用者控制項,並使用另一種模式 (字型) 將控制項置於表單上,而不會有任何問題,但是將某種模式中的基底表單與從另一種模式的衍生表單混合,可能會導致無法預期的結果。
自動調整運作
Windows Forms 會使用下列邏輯來自動調整表單及其內容:
在設計階段,每個 ContainerControl 會記錄縮放模式,以及各自在 AutoScaleMode 和 AutoScaleDimensions 中的目前解析度。
在執行階段,實際的解析度會儲存在 CurrentAutoScaleDimensions 屬性中。 AutoScaleFactor 屬性動態計算執行階段縮放解析和設計階段縮放解析間的比率。
當表單載入時,如果 CurrentAutoScaleDimensions 和 AutoScaleDimensions 的值不同,則會呼叫 PerformAutoScale 方法以縮放控制項和其子系。 這個方法會暫止配置並呼叫 Scale 方法,以執行實際的縮放。 之後,AutoScaleDimensions 的值會更新以避免繼續縮放。
在下列情況下,也會自動叫用 PerformAutoScale:
為了在縮放模式為 Font 時回應 OnFontChanged 事件。
當繼續容器控制項的配置,並在 AutoScaleDimensions 或 AutoScaleMode 屬性中偵測到變更時。
如上所指,當縮放父 ContainerControl 時。 每個容器控制項會負責使用自已的縮放比例 (而非其父容器的縮放比例),來縮放其子系。
子控制項可以透過幾種方式,修改其縮放行為:
可以覆寫 ScaleChildren 屬性,以判斷是否應該縮放其子控制項。
可以覆寫 GetScaledBounds 方法,以調整控制項的縮放範圍,而不是縮放邏輯。
可以覆寫 ScaleControl 方法,以變更目前控制項的縮放邏輯。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應