Share via


WPF 和 Windows Form 互通

WPF 和 Windows Forms 在建立應用程式介面方面,會呈現兩個不同的架構。 System.Windows.Forms.Integration 命名空間提供一般互通案例適用的類別。 可以實作互通功能的兩個重要類別為 WindowsFormsHostElementHost。 本主題說明支援和不支援的互通案例。

注意事項注意事項

對「混合控制項」(Hybrid Control) 要有特殊的考量。混合控制項是指一種技術的控制項中有另一種技術的控制項,這也稱為「巢狀互通」(Nested Interoperation)。「多層混合控制項」(Multilevel Hybrid Control) 具有一個以上的混合控制項巢狀層級。多層巢狀互通的範例是 Windows Forms 控制項包含 WPF 控制項,而這個控制項又包含另一個 Windows Forms 控制項。不支援多層混合控制項。

這個主題包含下列章節。

  • 將 Windows Form 控制項裝載在 WPF 中
  • 將 WPF 控制項裝載在 Windows Form 中
  • 相關主題

將 Windows Form 控制項裝載在 WPF 中

下列互通案例在 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-order),以控制重疊行為。 裝載的 Windows Forms 控制項會繪製於不同的 HWND 中,以永遠繪製在 WPF 項目的上面。

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

環境屬性

WPF 控制項的部分環境屬性具有 Windows Forms 對等用法。 這些環境屬性會傳播至裝載的 Windows Forms 控制項,並且公開為 WindowsFormsHost 控制項上的公用屬性。 WindowsFormsHost 控制項會將每個 WPF 環境屬性轉譯成其 Windows Forms 對等用法。

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

行為

下表說明互通行為。

行為

支援項目

不支援

透明度

Windows Forms 控制項呈現支援透明度。 父 WPF 控制項的背景可以變成已裝載 Windows Forms 控制項的背景。

部分 Windows Forms 控制項不支援透明度。 例如,當 TextBoxComboBox 控制項是由 WPF 裝載時,就不會是透明的。

Tab 鍵切換

已裝載的 Windows Forms 控制項的 Tab 鍵順序與這些控制項裝載於 Windows Forms 架構應用程式中時相同。

從 WPF 控制項到另一個 Windows Forms 控制項的 Tab 鍵切換可以如同往常般使用 TAB 鍵和 SHIFT+TAB 鍵執行。

當使用者利用 Tab 鍵在控制項之間切換時,TabStop 屬性值為 false 的 Windows Forms 控制項不會收到焦點。

  • 每個 WindowsFormsHost 控制項都有 TabIndex 值,這個會值決定 WindowsFormsHost 控制項收到焦點的時機。

  • 包含在 WindowsFormsHost 容器中的 Windows Forms 控制項會遵循 TabIndex 屬性所指定的順序。 從最後一個 Tab 鍵索引進行 Tab 鍵切換會將焦點放在下一個 WPF 控制項 (如果有的話)。 如果沒有其他可設定焦點的 WPF 控制項,Tab 鍵切換會回到 Tab 鍵順序中的第一個 Windows Forms 控制項。

  • WindowsFormsHost 內之控制項的 TabIndex 值,相對於 WindowsFormsHost 控制項中包含的同層級 (Sibling) Windows Forms 控制項。

  • Tab 鍵切換遵守控制項特定的行為。 例如,在 AcceptsTab 屬性值為 true 的 TextBox 控制項中按下 TAB 鍵,會在文字方塊中輸入定位點而非移動焦點。

不適用。

使用方向鍵巡覽

  • WindowsFormsHost 控制項中使用方向鍵巡覽,與在一般 Windows Forms 容器控制項中相同:向上鍵與向左鍵會選取上一個控制項,向下鍵和向右鍵會選取下一個控制項。

  • WindowsFormsHost 控制項中包含的第一個控制項使用向上鍵或向左鍵,會執行與 SHIFT+TAB 鍵盤快速鍵一樣的動作。 如果有可設定焦點的 WPF 控制項,焦點會移至 WindowsFormsHost 控制項之外。 這個行為與標準 ContainerControl 行為的不同之處在於它不會換到最後一個控制項。 如果沒有其他可設定焦點的 WPF 控制項,焦點就會回到 Tab 鍵順序中的最後一個 Windows Forms 控制項。

  • WindowsFormsHost 控制項中包含的最後一個控制項使用向下鍵或向右鍵,會執行與 TAB 鍵一樣的動作。 如果有可設定焦點的 WPF 控制項,焦點會移至 WindowsFormsHost 控制項之外。 這個行為與標準 ContainerControl 行為的不同之處在於它不會換到第一個控制項。 如果沒有其他可設定焦點的 WPF 控制項,焦點會回到 Tab 鍵順序中的第一個 Windows Forms 控制項。

不適用。

快速鍵

除非 [不支援] 欄位中已經註明,否則快速鍵會如同往常一般運作。

跨技術的重複快速鍵不會像一般重複快速鍵一樣的運作。 當有跨技術的重複快速鍵 (至少有一個快速鍵在 Windows Forms 控制項上,而有另一個在 WPF 控制項上) 時,Windows Forms 控制項就一定會收到快速鍵。 焦點不會在按下重複快速鍵時於控制項之間切換。

快速鍵

除非 [不支援] 欄位中已經註明,否則快速鍵會如同往常一般運作。

  • 在前置處理階段處理的 Windows Forms 快速鍵,其優先順序一律高於 WPF 快速鍵。 例如,如果為 ToolStrip 控制項定義了 CTRL+S 快速鍵,而已經有 WPF 命令繫結至 CTRL+S,則不論焦點在哪裡,一律會先叫用 ToolStrip 控制項處理常式。

  • 在 WPF 中,由 KeyDown 事件處理的 Windows Forms 快速鍵會最後處理。 您可以防止這個行為,方法是覆寫 Windows Forms 控制項的 IsInputKey 方法或處理 PreviewKeyDown 事件。 請從 IsInputKey 方法傳回 true,或將 PreviewKeyDown 事件處理常式中的 PreviewKeyDownEventArgs.IsInputKey 屬性的值設定為 true。

AcceptsReturn、AcceptsTab 及其他控制項特定行為

負責變更預設鍵盤行為的屬性會如同往常運作,並假設 Windows Forms 控制項會覆寫 IsInputKey 方法以傳回 true。

負責處理 KeyDown 事件來變更預設鍵盤行為的 Windows Forms 控制項,在主 WPF 控制項中會最後處理。 因為這些控制項最後處理,所以可能會產生無法預期的行為。

Enter 和 Leave 事件

當焦點不是要移至主 ElementHost 控制項時,Enter 和 Leave 事件會在單一 WindowsFormsHost 控制項中發生焦點變更時如同以往引發。

Enter 和 Leave 事件不會在下列焦點變更發生時引發:

多執行緒

支援各種多執行緒。

Windows Forms 和 WPF 技術都假設採用單一執行緒並行模型。 偵錯期間,其他執行緒對架構物件的呼叫會引發例外狀況以強制執行這項需求。

安全性

所有互通案例都需要完全信任。

不允許有互通案例只有部分信任。

協助工具

支援所有協助工具案例。 輔助技術產品在用於同時包含 Windows Forms 和 WPF 控制項的混合應用程式時可以正常運作。

不適用。

剪貼簿

所有剪貼簿都會如同往常運作。 這包括在 Windows Forms 和 WPF 控制項之間的剪下和貼上動作。

不適用。

拖放功能

所有拖放作業都會如往常運作。 這包括在 Windows Forms 和 WPF 控制項之間的作業。

不適用。

將 WPF 控制項裝載在 Windows Form 中

下列互通案例在 Windows Forms 控制項裝載 WPF 控制項時受到支援:

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

  • 讓屬性工作表 (Property Sheet) 與一個或多個裝載的 WPF 控制項產生關聯。

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

  • 啟動 WPF 視窗。

  • 裝載具有 Windows Forms 主要和 WPF 詳細資料的主從式表單。

  • 裝載具有 WPF 主要和 Windows Forms 詳細資料的主從式表單。

  • 裝載自訂 WPF 控制項。

  • 裝載混合控制項。

環境屬性

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

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

行為

下表說明互通行為。

行為

支援項目

不支援

透明度

WPF 控制項呈現支援透明度。 父 Windows Forms 控制項的背景可以變成已裝載 WPF 控制項的背景。

不適用。

多執行緒

支援各種多執行緒。

Windows Forms 和 WPF 技術都假設採用單一執行緒並行模型。 偵錯期間,其他執行緒對架構物件的呼叫會引發例外狀況以強制執行這項需求。

安全性

所有互通案例都需要完全信任。

不允許有互通案例只有部分信任。

協助工具

支援所有協助工具案例。 輔助技術產品在用於同時包含 Windows Forms 和 WPF 控制項的混合應用程式時可以正常運作。

不適用。

剪貼簿

所有剪貼簿都會如同往常運作。 這包括在 Windows Forms 和 WPF 控制項之間的剪下和貼上動作。

不適用。

拖放功能

所有拖放作業都會如往常運作。 這包括在 Windows Forms 和 WPF 控制項之間的作業。

不適用。

請參閱

工作

逐步解說:在 WPF 中裝載 Windows Form 控制項

參考

ElementHost

WindowsFormsHost

概念

逐步解說:在 WPF 中裝載 Windows Form 複合控制項

逐步解說:在 Windows Form 中裝載 WPF 複合控制項

Windows Form 和 WPF 屬性對應