WindowsFormsHost 項目的配置考量
本主題描述 WindowsFormsHost 元素如何與 WPF 版面配置系統互動。
WPF 和 Windows Forms 支援不同但為相似邏輯,用於調整和定位表單或頁面上的元素。 在 WPF 中建立裝載 Windows Forms 控制項的混合式使用者介面 (UI) 時,WindowsFormsHost 元素會整合這兩個版面配置。
WPF 與 Windows Forms 版面配置的差異
WPF 使用解析度獨立版面配置。 所有 WPF 版面配置維度都是使用裝置獨立像素來指定。 裝置獨立像素大小和解析度為 196 英吋,因此不論您要轉譯為 72-dpi 監視器還是 19,200-dpi 印表機,您都會收到類似的結果。
WPF 也以動態版面配置為基礎。 這表示 UI 元素會根據其內容、其父版面配置容器,以及可用的螢幕大小,在表單或頁面上自行排列。 動態版面配置可藉由在包含變更長度的字串時,自動調整 UI 元素的大小和位置,以利當地語系化。
Windows Forms 中的版面配置與裝置相關,更有可能是靜態的。 一般而言,Windows Forms 控制項會使用硬體像素中指定的維度絕對定位在表單上。 然而,Windows Forms 確實支援一些動態版面配置功能,如下表所述。
版面配置功能 | 描述 |
---|---|
自動調整大小 | 某些 Windows Forms 控制項會調整大小,以正確顯示其內容。 如需詳細資訊,請參閱 AutoSize 屬性概觀。 |
錨定和停駐 | Windows Forms 控制項支援根據父容器定位和調整大小。 如需詳細資訊,請參閱 Control.Anchor 和 Control.Dock。 |
自動調整 | 容器控制項會根據輸出裝置的解析度,或預設容器字型的大小,以像素為單位來調整本身及其子系的大小。 如需詳細資訊,請參閱 Windows Forms 中的自動縮放。 |
版面配置容器 | FlowLayoutPanel 和 TableLayoutPanel 控制項會根據其內容排列其子系控制項並自行調整大小。 |
版面配置限制
一般而言,Windows Forms 控制項無法在 WPF 中盡可能縮放和轉換。 下列清單描述當 WindowsFormsHost 元素嘗試將其裝載的 Windows Forms 控制項整合到 WPF 版面配置系統中時的已知限制。
在某些情況下,無法調整 Windows Forms 控制項大小,或只能將它調整為特定維度。 例如,Windows Forms ComboBox 控制項僅支援單一高度,該高度是由控制項的字型大小所定義。 在 WPF 動態版面配置中,元素可以垂直延展,裝載的 ComboBox 控制項不會如預期般延展。
Windows Forms 控制項無法旋轉或扭曲。 如果您套用扭曲或旋轉轉換,WindowsFormsHost 元素會引發 LayoutError 事件。 如果您未處理 LayoutError 事件,則會引發 InvalidOperationException。
在大部分情況下,Windows Forms 控制項不支援比例縮放。 雖然會縮放控制項的整體維度,但是可能無法如預期調整控制項的子控制項和元件大小。 這項限制取決於每個 Windows Forms 控制項支援縮放的方式。 此外,您無法將 Windows Forms 控制項縮小為 0 像素的大小。
Windows Forms 控制項支援自動調整,表單會根據字型大小自動調整本身及其控制項的大小。 在 WPF 使用者介面中,變更字型大小並不會調整整個版面配置大小,雖然可能會動態調整個別項目。
Z 順序
在 WPF 使用者介面中,您可以變更項目的 Z 順序以控制重疊行為。 裝載的 Windows Forms 控制項會在個別的 HWND 中繪製,因此一律會繪製在 WPF 元素之上。
裝載的 Windows Forms 控制項也會繪製在任何 Adorner 元素之上。
版面配置行為
下列各節說明在 WPF 中裝載 Windows Forms 控制項時版面配置行為的特定層面。
縮放、單位轉換和裝置獨立
每當 WindowsFormsHost 元素執行涉及 WPF 和 Windows Forms 維度的作業時,就會牽涉到兩個座標系統:WPF 的裝置獨立像素和 Windows Forms 的硬體像素。 因此,您必須套用適當的單位和縮放轉換,才能達到一致的版面配置。
座標系統之間的轉換取決於目前的裝置解析度,以及套用至 WindowsFormsHost 元素或其上階的任何版面配置或轉譯轉換。
如果輸出裝置為 96 dpi,且未將縮放比例套用至 WindowsFormsHost 元素,則一個裝置獨立像素等於一個硬體像素。
所有其他情況都需要座標系統縮放。 裝載的控制項不會調整大小。 相反地,WindowsFormsHost 元素會嘗試縮放裝載的控制項及其所有子系控制項。 因為 Windows Forms 不完全支援縮放,因此 WindowsFormsHost 元素會縮放為特定控制項所支援的程度。
覆寫 ScaleChild 方法,以提供裝載 Windows Forms 控制項的自訂縮放行為。
除了縮放之外,WindowsFormsHost 元素也會處理進位和溢位案例,如下表所述。
轉換問題 | 描述 |
---|---|
四捨五入 | WPF 裝置獨立像素維度會指定為 double ,而 Windows Forms 硬體像素維度則指定為 int 。 如果以 double 為基礎的維度轉換成以 int 為基礎的維度,WindowsFormsHost 元素會使用標準進位,讓小於 0.5 的小數值四捨五入為 0。 |
Overflow | 當 WindowsFormsHost 元素從 double 值轉換成 int 值時,則可能會溢位。 大於 MaxValue 的值會設定為 MaxValue。 |
版面配置相關屬性
控制 Windows Forms 控制項和 WPF 元素中的版面配置行為的屬性由 WindowsFormsHost 元素進行適當對應。 如需詳細資訊,請參閱 Windows Forms 和 WPF 屬性對應。
裝載控制項中的版面配置變更
裝載 Windows Forms 控制項中的版面配置變更會傳播至 WPF 以觸發版面配置更新。 WindowsFormsHost 上的 InvalidateMeasure 方法可確保裝載控制項中的版面配置變更會造成 WPF 版面配置引擎執行。
持續調整 Windows Forms 控制項的大小
支援持續縮放的 Windows Forms 控制項與 WPF 版面配置系統完全互動。 WindowsFormsHost 元素會像往常一樣使用 MeasureOverride 和 ArrangeOverride 方法來調整和排列裝載的 Windows Forms 控制項大小。
調整大小演算法
WindowsFormsHost 元素會使用下列程序來調整裝載控制項的大小:
WindowsFormsHost 元素會覆寫 MeasureOverride 和 ArrangeOverride 方法。
為了判斷裝載控制項的大小,MeasureOverride 方法會呼叫裝載控制項的 GetPreferredSize 方法,並使用從傳遞至 MeasureOverride 方法的條件約束轉譯條件約束。
ArrangeOverride 方法會嘗試將裝載的控制項設定為指定的大小條件約束。
如果裝載控制項的 Size 屬性符合指定的條件約束,則裝載控制項的大小將根據條件約束進行調整。
如果 Size 屬性不符合指定的條件約束,則裝載的控制項不支援連續調整大小。 例如,MonthCalendar 控制項只允許離散大小。 此控制項的允許的大小由高度和寬度的整數 (表示月數) 組成。 在此情況下,WindowsFormsHost 元素的行為如下所示:
如果 Size 屬性傳回的大小大於指定的條件約束,則 WindowsFormsHost 元素會裁剪裝載的控制項。 高度和寬度會分開處理,因此裝載的控制項可能會以任一方向裁剪。
如果 Size 屬性傳回小於指定條件約束的大小,則 WindowsFormsHost 會接受這個大小值,並將值傳回 WPF 版面配置系統。