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 控制項。
它可能會裝載一或多個複合控制項。
它可以使用可延伸的應用程式標記語言來裝載混合式控制項(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 控制項不支援透明度。 例如, 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 控制項上。 如果沒有其他可設定焦點的 WPF 控制項存在,Tabbing 會以定位順序傳回第一個 Windows Forms 控制項。 - TabIndex 內 WindowsFormsHost 控制項的值相對於 控制項中包含的 WindowsFormsHost 同層級 Windows Forms 控制項。 - 定位處理接受控制項特定行為。 例如,在具有 屬性值 true 的控制項 AcceptsTab 中 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 快速鍵。 例如,如果您的 ToolStrip 控制項已定義 CTRL+S 快速鍵,而且有系結至 CTRL+S 的 WPF 命令,則不論焦點為何, ToolStrip 控制項處理常式一律會先叫用。 - 事件所 KeyDown 處理的 Windows Forms 快速鍵會在 WPF 中最後處理。 您可以覆寫 Windows Forms 控制項的方法 IsInputKey 或處理 PreviewKeyDown 事件,以防止此行為。 從 方法傳 IsInputKey 回 true ,或在事件處理常式中 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 控制項之間的作業。 | 不適用。 |
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應