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 控制項不支援透明。 例如,WPF 裝載時,TextBox 和 ComboBox 控制項將不會是透明的。 |
定位處理 | 裝載 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 控制項。 - 定位處理接受控制項特定行為。 例如,在具有 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 快速鍵。 例如,如果您已定義具有 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 控制項之間的作業。 | 不適用。 |