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.AnchorControl.Dock
自動調整規模 容器控制項會根據輸出裝置的解析度,或預設容器字型的大小,以圖元為單位來調整本身及其子系的大小。 如需詳細資訊,請參閱 Windows Forms 中的自動調整。
版面配置容器 FlowLayoutPanelTableLayoutPanel 控制項會根據其內容排列其子控制項並自行調整大小。

版面配置限制

一般而言,Windows Forms 控制項無法在 WPF 中盡可能調整和轉換。 下列清單描述元素嘗試將其裝載的 Windows Forms 控制項整合到 WPF 版面配置系統中時的 WindowsFormsHost 已知限制。

  • 在某些情況下,Windows Forms 控制項無法調整大小,或只能調整為特定維度的大小。 例如,Windows Forms ComboBox 控制項只支援單一高度,由控制項的字型大小定義。 在可垂直延展元素的 WPF 動態配置中,裝載的 ComboBox 控制項不會如預期般延展。

  • Windows Forms 控制項無法旋轉或扭曲。 如果您套用扭曲或旋轉轉換, LayoutError 元素 WindowsFormsHost 會引發 事件。 如果您未處理 LayoutError 事件, InvalidOperationException 則會引發 。

  • 在大部分情況下,Windows Forms 控制項不支援比例調整。 雖然會縮放控制項的整體維度,但是可能無法如預期調整控制項的子控制項和元件大小。 這項限制取決於每個 Windows Forms 控制項支援調整的方式。 此外,您無法將 Windows Forms 控制項縮小為 0 圖元的大小。

  • Windows Forms 控制項支援自動調整,表單會根據字型大小自動調整本身及其控制項的大小。 在 WPF 使用者介面中,變更字型大小並不會調整整個版面配置的大小,不過個別元素可能會動態調整大小。

Z 順序

在 WPF 使用者介面中,您可以變更元素的迭置順序來控制重迭行為。 裝載的 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 硬體圖元維度則指定為 intdouble如果以為基礎的維度轉換成 int 以為基礎的維度,元素 WindowsFormsHost 會使用標準四捨五入,讓小於 0.5 的小數值四捨五入為 0。
Overflow WindowsFormsHost當專案從 double 值轉換成值 int 時,可能會溢位。 大於 MaxValue 的值會設定為 MaxValue

在 Windows Forms 控制項和 WPF 元素中控制版面配置行為的屬性會由 WindowsFormsHost 專案適當地對應。 如需詳細資訊,請參閱 Windows Forms 和 WPF 屬性對應

主控控制項中的版面配置變更

裝載 Windows Forms 控制項中的版面配置變更會傳播至 WPF 以觸發版面配置更新。 InvalidateMeasure上的 WindowsFormsHost 方法可確保裝載控制項中的版面配置變更會導致 WPF 配置引擎執行。

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

支援持續調整的 Windows Forms 控制項與 WPF 版面配置系統完全互動。 元素 WindowsFormsHost 會像往常一樣使用 MeasureOverrideArrangeOverride 方法來調整和排列裝載的 Windows Forms 控制項的大小。

調整大小演算法

元素 WindowsFormsHost 會使用下列程式來調整裝載控制項的大小:

  1. 元素 WindowsFormsHostMeasureOverride 覆寫 和 ArrangeOverride 方法。

  2. 若要判斷裝載控制項的大小,方法會呼叫裝載 GetPreferredSize 控制項的 方法, MeasureOverride 並將條件約束從傳遞至 MeasureOverride 方法的條件約束轉譯。

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

  4. 如果主控控制項的 Size 屬性符合指定的條件約束,則主控控制項的大小會調整為條件約束。

Size如果 屬性不符合指定的條件約束,則裝載的控制項不支援連續調整大小。 例如, MonthCalendar 控制項只允許離散大小。 此控制項的允許大小包含整數(代表高度和寬度的月數)。 在此情況下,元素 WindowsFormsHost 的行為如下所示:

  • 如果 屬性傳 Size 回的大小大於指定的條件約束,元素會 WindowsFormsHost 裁剪裝載的控制項。 高度和寬度會分開處理,因此裝載的控制項可能會以任一方向裁剪。

  • 如果 屬性傳 Size 回小於指定條件約束的大小, WindowsFormsHost 請接受這個大小值,並將值傳回 WPF 配置系統。

另請參閱