WPF 和 Windows Forms 互通

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

注意

「混合控制項」情節有其特殊考量。 混合控制項中有某種技術的控制項巢狀於另一種技術的控制項中。 這也稱為「巢狀交互操作」。 「多層混合控制項」具有多個層級的混合控制項巢狀結構。 多層次巢狀交互操作的範例是包含 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 控制項。

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

  • 它可以使用可延伸的應用程式標記語言來裝載混合式控制項(XAML)。

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

版面配置支援

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

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

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

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

  • 在 WPF 使用者介面中,您可以變更元素的迭置順序來控制重迭行為。 裝載的 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 控制項不支援透明度。 例如, TextBoxComboBox 控制項在 WPF 裝載時不會是透明的。
定位處理 託管 Windows Forms 控制項的定位順序與這些控制項裝載在 Windows Forms 型應用程式中時相同。

使用 TAB 鍵和 SHIFT+TAB 鍵從 WPF 控制項到 Windows Forms 控制項的索引標籤功能會如往常般運作。

當使用者透過控制項索引標籤時,具有 屬性值的 TabStopfalse Windows Forms 控制項不會收到焦點。

- 每個 WindowsFormsHost 控制項都有一個 TabIndex 值,決定該 WindowsFormsHost 控制項何時會收到焦點。
- 包含在容器內的 WindowsFormsHost Windows Forms 控制項會遵循 屬性所 TabIndex 指定的順序。 如果下一個 WPF 控制項存在,則最後一個索引標籤索引的索引標籤會將焦點放在下一個 WPF 控制項上。 如果沒有其他可設定焦點的 WPF 控制項存在,Tabbing 會以定位順序傳回第一個 Windows Forms 控制項。
- TabIndexWindowsFormsHost 控制項的值相對於 控制項中包含的 WindowsFormsHost 同層級 Windows Forms 控制項。
- 定位處理接受控制項特定行為。 例如,在具有 屬性值 true 的控制項 AcceptsTabTextBox 按 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 快速鍵。 例如,如果您的 ToolStrip 控制項已定義 CTRL+S 快速鍵,而且有系結至 CTRL+S 的 WPF 命令,則不論焦點為何, ToolStrip 控制項處理常式一律會先叫用。
- 事件所 KeyDown 處理的 Windows Forms 快速鍵會在 WPF 中最後處理。 您可以覆寫 Windows Forms 控制項的方法 IsInputKey 或處理 PreviewKeyDown 事件,以防止此行為。 從 方法傳 IsInputKeytrue ,或在事件處理常式中 PreviewKeyDown 將 屬性的值 PreviewKeyDownEventArgs.IsInputKey 設定為 true
AcceptsReturn、AcceptsTab 和其他控制項特定行為 變更預設鍵盤行為的屬性會如往常運作,假設 Windows Forms 控制項會 IsInputKey 覆寫 方法以傳回 true 處理事件來 KeyDown 變更預設鍵盤行為的 Windows Forms 控制項,最後會在主 WPF 控制項中處理。 因為這些控制項會最後處理,所以它們會產生非預期的行為。
Enter 和 Leave 事件 當焦點不會移至包含 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 控制項之間的作業。 不適用。

另請參閱