WPF 和 Windows Forms 互操作

WPF 和 Windows Forms 提供兩種不同的架構來建立應用程式介面。 System.Windows.Forms.Integration 命名空間提供可啟用常見互操作案例的類別。 實作互操作功能的兩個主要類別是 WindowsFormsHost 和 ElementHost。 本主題描述支援的交互操作情節以及不支援的情節。

備註

特別考量混合控制情境。 具有混合技術的控制項是指一種技術的控制項嵌入在另一種技術的控制項中。 這也稱為「巢狀交互操作」。 「多層混合控制項」具有多個層級的混合控制項巢狀結構。 多層次巢狀互操作的範例是包含 WPF 控制項的 Windows Forms 控制項,其中包含另一個 Windows Forms 控制項。 不支援多層混合控制項。

在 WPF 中裝載 Windows Forms 控制項

當 WPF 控制項裝載 Windows Forms 控制項時,支援下列互操作案例:

  • WPF 控制項可以使用 XAML 裝載一或多個 Windows Forms 控制項。

  • 它可能會使用程式碼裝載一或多個 Windows Forms 控制項。

  • 它可以裝載包含其他 Windows Forms 控制項的 Windows Forms 容器控制項。

  • 它可能會承載一個包含 WPF 主表單和 Windows Forms 詳細資料的主/從表單。

  • 它可能會裝載具有 Windows Forms 主圖形和 WPF 詳細資料的主圖形/詳細資料表單。

  • 它可能裝載一或多個 ActiveX 控制項。

  • 它可能會裝載一或多個複合控制項。

  • 它可能使用 Extensible Application Markup Language (XAML) 來裝載混合式控制項。

  • 它可能會使用程式碼裝載混合控制項。

版面配置支援

下列清單描述當 WindowsFormsHost 元素嘗試將其裝載的 Windows Forms 控制項整合到 WPF 版面配置系統中時的已知限制。

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

  • Windows Forms 控制項無法旋轉或扭曲。 例如,將使用者介面旋轉 90 度時,裝載的 Windows Forms 控制項將維持其垂直位置。

  • 在大部分情況下,Windows Forms 控制項不支援比例縮放。 雖然控制項的整體尺寸會縮放,但子控制項及其內部元件的大小可能不會按預期調整。 這項限制取決於每個 Windows Forms 控制項支援縮放的方式。

  • 在 WPF 使用者介面中,您可以變更項目的 Z 順序以控制重疊行為。 裝載的 Windows Forms 控制項會在個別的 HWND 中繪製,因此一律會繪製在 WPF 元素之上。

  • Windows Forms 控制項支援根據字型大小自動縮放。 在 WPF 使用者介面中,變更字型大小並不會調整整個版面配置大小,雖然可能會動態調整個別項目。

環境屬性

WPF 控制項的某些環境屬性也有相應的 Windows Forms 對等項目。 這些環境屬性會傳播至裝載的 Windows Forms 控制項,並在 WindowsFormsHost 控制項上公開為公用屬性。 WindowsFormsHost 控制項會將每個 WPF 環境屬性轉譯成其 Windows Forms 相等項目。

如需詳細資訊,請參閱 Windows Forms 和 WPF 屬性對應。

行為

下表描述交互操作行為。

行為 支持 不支援
透明度 Windows Forms 控制項轉譯支持透明度。 父代 WPF 控制項的背景可以成為裝載的 Windows Forms 控制項的背景。 有些 Windows Forms 控制項不支援透明。 例如,TextBox 和 ComboBox 控制項在 WPF 承載時將不會是透明的。
按鍵控制 裝載 Windows Forms 控制項的標籤順序與這些控制項裝載在 Windows Forms 型應用程式中時相同。

使用 TAB 鍵和 SHIFT+TAB 鍵從 WPF 控制項切換到 Windows Forms 控制項時,功能運作如常。

具有 TabStop 屬性值為 false 的 Windows Forms 控制項在使用者在控制項間切換時不會獲得焦點。

- 每個WindowsFormsHost控制項都有一個TabIndex值,決定該WindowsFormsHost控制項何時會收到焦點。
- 包含在 WindowsFormsHost 容器內的 Windows Forms 控制項會遵循 TabIndex 屬性所指定的順序。 從最後一個標籤索引切換時,將焦點放在下一個 WPF 控制項(若存在)。 如果沒有其他可設定焦點的 WPF 控制項存在,則焦點將返回到定位順序中的第一個 Windows Forms 控制項。
- 內控制項的 TabIndexWindowsFormsHost 值是相對於 WindowsFormsHost 控制項內所包含的同層級 Windows Forms 控制項。
- 按下Tab鍵時會遵循控制項的特定行為。 例如,在具有 TextBox 的 AcceptsTab 屬性值的 true 控制項中按下 TAB 鍵,會在文字輸入框中輸入索引標籤,而不是移動焦點。
不適用。
使用方向鍵巡覽 - 在 WindowsFormsHost 控制項中使用方向鍵進行巡覽,與在一般 Windows Forms 容器控制項中相同:[向上鍵] 和 [向左鍵] 會選取前一個控制項,[向下鍵] 和 [向右鍵] 則會選取下一個控制項。
- 包含在 WindowsFormsHost 控制項中的第一個控制項的 [向上鍵] 和 [向左鍵] 執行的動作與 SHIFT+TAB 鍵盤快速鍵相同。 如果有可設定焦點的 WPF 控制項,焦點會在 WindowsFormsHost 控制項外移動。 此行為與標準 ContainerControl 行為不同,因為不會換行至最後一個控制項。 如果沒有其他可設定焦點的 WPF 控制項存在,焦點將回到定位順序中的最後一個 Windows Forms 控制項。
- 包含在 WindowsFormsHost 控制項中的最後一個控制項的[向下鍵]和[向右鍵],其功能與 TAB 鍵相同。 如果有可設定焦點的 WPF 控制項,焦點會在 WindowsFormsHost 控制項外移動。 此行為與標準 ContainerControl 行為不同,因為不會換行至第一個控制項。 如果沒有其他可設定焦點的 WPF 控制項存在,焦點會依定位順序返回到第一個 Windows Forms 控制項。
不適用。
加速器 加速器通常如常運作,除非在「不支援」欄中另有註明。 跨技術的重複加速器的運作方式與一般的重複加速器不同。 當加速器被重複使用於不同技術中時,其中一個位於 Windows Forms 控制項上,而另一個在 WPF 控制項上,Windows Forms 控制項總是會獲得加速器。 按下重複快速鍵時,不會切換控制項之間的焦點。
快速鍵 除非在「不支援」欄中註明,否則快捷鍵將正常運作。 在前置處理階段處理的 Windows Forms 快速鍵,其優先順序高於 WPF 快速鍵。 例如,如果您已定義具有 CTRL+S 快速鍵的 ToolStrip 控制項,而且有繫結至 CTRL+S 的 WPF 命令,則不論焦點為何,ToolStrip 控制項處理程式一律會先叫用。
- 由 KeyDown 事件處理的 Windows Forms 快速鍵會在 WPF 中最後處理。 您可以覆寫 Windows Forms 控制項的 IsInputKey 方法或處理 PreviewKeyDown 事件,以防止此行為。 從 true 方法傳回 IsInputKey ,或將 PreviewKeyDownEventArgs.IsInputKey 屬性值設定為 true 事件處理程式中的 PreviewKeyDown。
AcceptsReturn、AcceptsTab 和其他控制項特定行為 假設 Windows Forms 控制項會覆寫 IsInputKey 方法以傳回 true,這些用來改變預設鍵盤行為的屬性將會如往常般運作。 以處理 KeyDown 事件方式變更預設鍵盤行為的 Windows Forms 控制項會在主機 WPF 控制項中最後處理。 因為這些控制項會最後處理,所以它們會產生非預期的行為。
進入與離開事件 當焦點不會移至包含 ElementHost 控制項時,當焦點在單一 WindowsFormsHost 控制項中變更時,會像往常一樣引發 Enter 和 Leave 事件。 發生下列焦點變更時,不會引發 Enter 和 Leave 事件:

- 從 WindowsFormsHost 控制項內部到外部。
- 從 WindowsFormsHost 控制項外部到內部。
- 在 WindowsFormsHost 控制項之外。
- 從裝載於 WindowsFormsHost 控制項的 Windows Forms 控制項,到裝載於相同 ElementHost 內的 WindowsFormsHost 控制項。
多線程 支援各種多執行緒。 Windows Forms 和 WPF 技術都採用單一執行緒並行存取模型。 在偵錯期間,其他執行緒中架構物件的呼叫將會引發例外狀況,來強制執行這項需求。
安全性 所有互操作場景都需要完全信任。 在部分信任中,不允許交互操作情節。
可及性 支援所有無障礙情境。 輔助技術產品用於包含 Windows Forms 和 WPF 控制項的混合應用程式時,可正常運作。 不適用。
剪貼板 所有剪貼簿作業都會如常運作。 這包括在 Windows Forms 和 WPF 控制項之間剪下和貼上。 不適用。
拖放功能 所有拖放作業都會如常運作。 這包括 Windows Forms 與 WPF 控制項之間的作業。 不適用。

將 WPF 控制項裝載在 Windows Forms 中

當 Windows Forms 控制項裝載 WPF 控制項時,支援下列互操作案例:

  • 使用程式碼來裝載一或多個 WPF 控制項。

  • 將屬性表單與一個或多個已裝載的 WPF 控制項建立關聯。

  • 在表單中裝載一或多個 WPF 頁面。

  • 啟動 WPF 視窗。

  • 裝載具有 Windows Forms 主圖形和 WPF 詳細資料的主圖形/詳細資料表單。

  • 裝載具有 WPF 主圖形和 Windows Forms 詳細資料的主圖形/詳細資料表單。

  • 裝載自訂 WPF 控制項。

  • 裝載混合控制項。

環境屬性

Windows Forms 控制項的某些環境屬性具有 WPF 對等項目。 這些環境屬性會傳播至裝載的 WPF 控制項,並在 ElementHost 控制項上公開為公用屬性。 ElementHost 控制項會將每個 Windows Forms 環境屬性轉譯為其 WPF 對等項目。

如需詳細資訊,請參閱 Windows Forms 和 WPF 屬性對應。

行為

下表描述交互操作行為。

行為 支持 不支援
透明度 WPF 控制項轉譯支援透明度。 父代 Windows Forms 控制項的背景可以成為裝載的 WPF 控制項的背景。 不適用。
多線程 支援各種多執行緒。 Windows Forms 和 WPF 技術都採用單一執行緒並行存取模型。 在偵錯期間,其他執行緒中架構物件的呼叫將會引發例外狀況,來強制執行這項需求。
安全性 所有互操作場景都需要完全信任。 在部分信任中,不允許交互操作情節。
可及性 支援所有無障礙情境。 輔助技術產品用於包含 Windows Forms 和 WPF 控制項的混合應用程式時,可正常運作。 不適用。
剪貼板 所有剪貼簿作業都會如常運作。 這包括在 Windows Forms 和 WPF 控制項之間剪下和貼上。 不適用。
拖放功能 所有拖放作業都會如常運作。 這包括 Windows Forms 與 WPF 控制項之間的作業。 不適用。

另請參閱