共用方式為


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 控制項。

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

  • 它可能使用 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 控制項不支援透明。 例如,WPF 裝載時,TextBoxComboBox 控制項將不會是透明的。
定位處理 裝載 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 控制項。
WindowsFormsHost 內控制項的 - TabIndex 值相對於 WindowsFormsHost 控制項中包含的同層級 Windows Forms 控制項。
- 定位處理接受控制項特定行為。 例如,在具有 trueAcceptsTab 屬性值的 TextBox 控制項中按下 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 事件,以防止此行為。 從 IsInputKey 方法傳回 true ,或將 PreviewKeyDownEventArgs.IsInputKey 屬性值設定為 PreviewKeyDown 事件處理程式中的 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 控制項,到裝載於相同 WindowsFormsHost 內的 ElementHost 控制項。
多執行緒 支援各種多執行緒。 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 控制項之間的作業。 不適用。

另請參閱