WindowsFormsHost 項目的配置考量

更新:2007 年 11 月

本主題說明 WindowsFormsHost 項目與 WPF 配置系統的互動方式。

WPF 與 Windows Form 支援不同但類似的邏輯,以供在表單或頁面上調整項目的大小及加以定位。當您建立可在 WPF 中裝載 Windows Form 控制項的混合使用者介面 (UI) 時,WindowsFormsHost 項目會整合這兩種配置機制。

Windows Presentation Foundation 和 Windows Forms 之間的配置差異

WPF 會使用無關解析度的配置。所有 WPF 配置維度 (Dimension) 都使用「與裝置無關的像素」(Device-Independent Pixel) 加以指定。與裝置無關的像素就是大小為一英吋的九十六分之一而且與解析度無關,所以不論您是呈現至 72 dpi 監視器或 19,200 dpi 印表機,都會得到類似的結果。

WPF 也是以「動態配置」(Dynamic Layout) 為基礎。這表示 UI 項目會根據其內容、其父配置容器和可用螢幕大小,自行排列於表單或頁面上。當 UI 項目包含的字串變更長度時,動態配置會自動調整 UI 項目的大小和位置,進而促成當地語系化。

Windows Form 的配置與裝置相關,且較有可能是靜態的。通常,Windows Form 控制項會使用以硬體像素指定的維度,以絕對方式定位於表單上。然而,Windows Form 不支援某些動態配置功能,如下表簡述。

配置功能

描述

自動調整大小

有些 Windows Form 控制項會自行調整大小,以便正確顯示其內容。如需詳細資訊,請參閱 AutoSize 屬性概觀

錨定和停駐

Windows Form 控制項支援以父容器為基準的定位與調整大小。如需詳細資訊,請參閱 Control.AnchorControl.Dock

自動縮放

容器控制項會根據輸出裝置的解析度或預設容器字型的大小 (以像素為單位),調整本身與其子系的大小。如需詳細資訊,請參閱 Windows Form 中的自動縮放比例

配置容器

FlowLayoutPanelTableLayoutPanel 控制項會根據其內容來排列其子控制項並調整本身大小。

配置限制

一般而言,Windows Form 控制項無法縮放及轉換成 WPF 中可能的範圍。下列清單說明當 WindowsFormsHost 項目嘗試將其裝載的 Windows Form 控制項整合到 WPF 配置系統時的已知限制。

  • 在某些情況下,Windows Form 控制項無法調整大小,或只能將大小調整為特定維度。例如,Windows FormComboBox 控制項僅支援由控制項的字型大小所定義的單一高度。在項目可以自動垂直縮放的 WPF 動態配置中,裝載的 ComboBox 控制項並不會如預期地自動縮放。

  • Windows Form 控制項無法加以旋轉或傾斜。如果您套用傾斜或旋轉轉換,WindowsFormsHost 會引發 LayoutError 事件。如果您不處理 LayoutError 事件,則會引發 InvalidOperationException

  • 在大部分的情況下,Windows Form 控制項不支援按比例縮放。雖然控制項的全部維度都會縮放,但控制項的子控制項和元件可能無法如預期地調整大小。這項限制取決於每個 Windows Form 控制項支援縮放的程度。此外,您無法將 Windows Form 控制項縮小至大小為 0 像素。

  • Windows Form 控制項可支援自動縮放,於是表單會根據字型大小來自動調整本身及其控制項的大小。在 WPF 使用者介面中,縱然個別項目可以動態調整大小,但變更字型大小並不會調整整個配置的大小。

疊置順序

在 WPF 使用者介面中,您可以變更項目的疊置順序 (Z-order),以控制重疊行為。裝載的 Windows Form 控制項會繪製於個別的 HWND 中,所以它一律會繪製在 WPF 項目的上面。

裝載的 Windows Form 控制項也會繪製於任何 Adorner 項目的上面。

配置行為

下列章節說明在 WPF 中裝載 Windows Form 控制項時,配置行為的特定層面。

縮放比例、單位轉換和裝置獨立

每當 WindowsFormsHost 項目執行與 WPF 和 Windows Form 維度有關的作業時,會牽涉到兩個座標系統:WPF 的與裝置無關像素以及 Windows Form 的硬體像素。因此,您必須套用適當的單位與縮放轉換,才能達成一致的配置。

座標系統之間的轉換,取決於目前的裝置解析度以及任何已套用至 WindowsFormsHost 項目或其祖系的配置或呈現轉換。

如果輸出裝置為 96 dpi,而且 WindowsFormsHost 項目尚未套用任何縮放比例,則一個與裝置無關像素就等於一個硬體像素。

其他所有狀況都需要座標系統縮放功能。裝載的控制項並未調整大小。反而,WindowsFormsHost 項目會嘗試縮放裝載的控制項與其所有的子控制項。因為 Windows Form 不完全支援縮放功能,所以 WindowsFormsHost 項目會縮放至特定控制項所支援的程度。

覆寫 ScaleChild 方法,可為裝載的 Windows Form 控制項提供自訂縮放行為。

除了縮放以外,WindowsFormsHost 項目還可處理如下表所述的四捨五入與溢位情形。

轉換問題

描述

四捨五入

WPF 與裝置無關的像素維度會指定為 double,而 Windows Form 硬體像素維度則會指定為 int。在 double 型維度轉換成 int 型維度的情形中,WindowsFormsHost 項目會使用標準四捨五入,所以小於 0.5 的小數值會捨去為 0。

溢位

WindowsFormsHost 項目從 double 值轉換成 int 值時,可能會發生溢位。大於 MaxValue 的值會設定為 MaxValue

與配置相關的屬性

WindowsFormsHost 項目會適當地對應在 Windows Form 控制項和 WPF 項目中控制配置行為的屬性。如需詳細資訊,請參閱 Windows Form 和 WPF 屬性對應

所裝載控制項的配置變更

所裝載 Windows Form 控制項的配置變更會傳播至 WPF,以觸發配置更新。WindowsFormsHost 上的 InvalidateMeasure 方法可確保所裝載控制項的配置變更,能促使 WPF 配置引擎執行。

連續調整大小的 Windows Forms 控制項

支援連續縮放的 Windows Form 控制項,可與 WPF 配置系統完整互動。WindowsFormsHost 項目會一如往常使用 MeasureOverrideArrangeOverride 方法,來調整所裝載 Windows Form 控制項的大小並加以排列。

調整大小演算法

WindowsFormsHost 項目使用下列程序來調整所裝載控制項的大小:

  1. WindowsFormsHost 項目會覆寫 MeasureOverrideArrangeOverride 方法。

  2. 為了要決定所裝載控制項的大小,MeasureOverride 方法會使用從已傳遞至 MeasureOverride 方法之條件約束轉譯而來的條件約束,呼叫所裝載控制項的 GetPreferredSize 方法。

  3. ArrangeOverride 方法會嘗試將裝載的控制項設定為指定的大小條件約束。

  4. 如果所裝載控制項的 Size 屬性符合指定的條件約束,所裝載控制項的大小便會調整成此條件約束。

如果 Size 屬性不符合指定的條件約束,則裝載的控制項不支援連續調整大小。例如,MonthCalendar 控制項只允許不連續的大小。此控制項的許可大小是由高度與寬度的整數 (表示月份數) 所構成。在此種情況下,WindowsFormsHost 項目的行為如下:

  • 如果 Size 屬性所傳回的大小大於指定的條件約束,則 WindowsFormsHost 項目會裁剪裝載的控制項。系統會分開處理高度和寬度,所以可能會裁剪所裝載控制項的某一個方向。

  • 如果 Size 屬性所傳回的大小小於指定的條件約束,則 WindowsFormsHost 會接受此大小值並將此值傳回至 WPF 配置系統。

請參閱

工作

逐步解說:在 Windows Presentation Foundation 中排列 Windows Form 控制項

在 Windows Presentation Foundation 中排列 Windows Form 控制項範例

概念

Windows Form 和 WPF 屬性對應

參考

ElementHost

WindowsFormsHost

其他資源

移轉和互通性