Share via


混合應用程式疑難排解

更新:2007 年 11 月

本主題會列出撰寫同時使用 WPF 和 Windows Form 技術的混合應用程式時,所發生的一些常見問題。

重疊控制項

控制項可能不會如您預期般地重疊。Windows Form 會針對每個控制項使用不同的 HWND。WPF 則會針對頁面上的所有內容使用同一個 HWND。這項實作上的差異會造成未預期的重疊行為。

裝載於 WPF 的 Windows Form 控制項一定會顯示在 WPF 內容的頂端。

裝載於 ElementHost 控制項中的 WPF 內容會依疊置順序 (Z-order) 顯示在 ElementHost 控制項中。您可以重疊 ElementHost 控制項,但是裝載的 WPF 內容不會合併或互動。

Child 屬性

WindowsFormsHostElementHost 類別只能裝載單一子控制項或項目。若要裝載多個控制項或項目,您必須使用容器做為子內容。例如,您可以將 Windows Form 按鈕和核取方塊控制項加入至 System.Windows.Forms.Panel 控制項,然後將面板指派給 WindowsFormsHost 控制項的 Child 屬性。不過,您無法將按鈕和核取方塊控制項個別加入至相同的 WindowsFormsHost 控制項。

縮放

WPF 和 Windows Form 具有不同的縮放模型。部分 WPF 縮放轉換對 Windows Form 控制項是有意義的,但是其他的轉換則無。例如,將 Windows Form 控制項縮放為 0 就行得通,但是如果嘗試將同一個控制項縮放回非零的值,則控制項的大小會維持 0。如需詳細資訊,請參閱 WindowsFormsHost 項目的配置考量

配接器

當您使用 WindowsFormsHostElementHost 類別時可能會有疑惑,因為它們包含隱藏的容器。WindowsFormsHostElementHost 類別都有隱藏的容器,稱為「配接器」(Adapter),用來裝載內容。對於 WindowsFormsHost 項目而言,配接器是衍生自 System.Windows.Forms.ContainerControl 類別。對於 ElementHost 控制項而言,配接器是衍生自 DockPanel 項目。如果其他互通主題中提到了配接器,就是在討論這個容器。

巢狀

不支援在 ElementHost 控制項內包含 WindowsFormsHost 項目,也不支援在 WindowsFormsHost 項目內包含 ElementHost 控制項。

焦點

WPF 和 Windows Form 中的焦點 (Focus) 運作方式不同,也就是說在混合應用程式中可能會發生焦點問題。例如,如果焦點是在 WindowsFormsHost 項目內,而您將頁面最小化並還原,或顯示強制回應 (Modal) 對話方塊,則 WindowsFormsHost 項目內的焦點可能就會遺失。WindowsFormsHost 項目仍然具有焦點,但是其中的控制項則無。

資料驗證也會受焦點影響。驗證在 WindowsFormsHost 項目中可以正常運作,但是當您按 Tab 鍵離開 WindowsFormsHost 項目,或是在兩個不同的 WindowsFormsHost 項目之間切換時,驗證就沒有作用。

屬性對應

有些屬性對應需要大量解譯才能銜接 WPF 和 Windows Form 技術之間的不同實作。屬性對應可以讓您的程式碼回應字型、色彩及其他屬性的變更。一般來說,屬性對應的運作方式是接聽 PropertyChanged 事件或 OnPropertyChanged 呼叫,然後在子控制項或其配接器上設定適當的屬性。如需詳細資訊,請參閱 Windows Form 和 WPF 屬性對應

裝載的內容上與配置相關的屬性

指派 WindowsFormsHost.ChildElementHost.Child 屬性時,會自動設定裝載的內容上數個與配置相關的屬性。變更這些內容屬性會造成未預期的配置行為。

您的裝載內容會停駐以填滿 WindowsFormsHostElementHost 父代 (Parent)。若要啟用這個填滿行為,在設定子屬性時要設定數個屬性。下表列出由 ElementHostWindowsFormsHost 類別所設定的內容屬性。

主類別

內容屬性

ElementHost

Height

Width

Margin

VerticalAlignment

HorizontalAlignment

WindowsFormsHost

Margin

Dock

AutoSize

Location

MaximumSize

請勿直接在裝載的內容上設定這些屬性。如需詳細資訊,請參閱 WindowsFormsHost 項目的配置考量

巡覽應用程式

巡覽應用程式可能不會維護使用者狀態。WindowsFormsHost 項目會在用於巡覽應用程式中時重新建立其控制項。當使用者離開裝載 WindowsFormsHost 項目的頁面後又返回時,就會重新建立子控制項。使用者輸入的任何內容都會遺失。

訊息迴圈互通

使用 Windows Form 訊息迴圈時,可能無法如預期般地處理訊息。WindowsFormsHost 建構函式會呼叫 EnableWindowsFormsInterop 方法。這個方法會將訊息篩選條件加入至 WPF 訊息迴圈。如果 System.Windows.Forms.Control 是訊息的目標並且會轉譯/分派訊息,這個篩選條件會呼叫 Control.PreProcessMessage 方法。

如果您在 Windows Form 訊息迴圈中使用 Application.Run 顯示 Window,則除非呼叫 EnableModelessKeyboardInterop 方法,否則無法輸入任何文字。EnableModelessKeyboardInterop 方法會採用 Window,並且在 WPF 訊息迴圈中加入會重新傳送索引鍵相關訊息的 System.Windows.Forms.IMessageFilter。如需詳細資訊,請參閱 Windows Form 和 WPF 互通性輸入架構

不透明度與分層

HwndHost 類別不支援分層。這表示設定 WindowsFormsHost 項目上的 Opacity 屬性沒有效果,而且不會與 AllowsTransparency 設為 true 的其他 WPF 視窗混色。

處置

類別處置 (Dispose) 不當會使資源外洩。在混合應用程式中,請確實處置 WindowsFormsHostElementHost 類別,否則資源可能會外洩。Windows Form 會在 ElementHost 控制項的非強制回應 Form 父代關閉時處置該控制項,而 WPF 會在應用程式關閉時處置 WindowsFormsHost。您可以在 Windows Form 訊息迴圈的 Window 中顯示 WindowsFormsHost 項目。在此情況下,您的程式碼可能不會收到應用程式正在關閉的告知。

啟用視覺化樣式

Windows Form 控制項上的 Microsoft Windows XP 視覺化樣式可能未啟用。Windows Form 應用程式的範本中會呼叫 Application.EnableVisualStyles 方法。雖然預設不會呼叫這個方法,但是如果您使用 Visual Studio 建立專案,且 Comctl32.dll 的 6.0 版是可用的,則會得到控制項的 Microsoft Windows XP 視覺化樣式。在執行緒上建立控制代碼之前,您必須先呼叫 EnableVisualStyles 方法。如需詳細資訊,請參閱 HOW TO:在混合應用程式中啟用視覺化樣式

授權控制項

在訊息方塊中對使用者顯示授權資訊的授權 Windows Form 控制項,可能會造成混合應用程式的未預期的行為。某些授權控制項會顯示對話方塊以回應控制代碼建立作業。例如,授權控制項可能會通知使用者需要授權,或使用者對控制項還有三次試用機會。

WindowsFormsHost 項目是衍生自 HwndHost 類別,而子控制項的控制代碼會在 BuildWindowCore 方法內建立。HwndHost 類別不允許用 BuildWindowCore 方法處理訊息,但是顯示對話方塊時會傳送訊息。若要啟用這個授權案例,請在將 Control.CreateControl 方法指派為 WindowsFormsHost 項目的子項目之前,先呼叫該方法。

WPF 設計工具

您可以使用 Windows Presentation Foundation (WPF) Designer for Visual Studio 設計 WPF 內容。下列各節列出使用 WPF 設計工具撰寫混合應用式時可能發生的一些常見問題。

設計階段忽略 BackColorTransparent

BackColorTransparent 屬性在設計階段可能無法達到預期的效果。

如果 WPF 控制項不是可見的父代 (Parent),WPF 執行階段便會忽略 BackColorTransparent 值。可能忽略 BackColorTransparent 的原因是因為 ElementHost 物件是在個別的 AppDomain 中建立。不過,當您執行應用程式時,BackColorTransparent 卻無法產生預期的效果。

刪除 obj 資料夾時出現設計階段錯誤清單

若刪除 obj 物件,設計階段錯誤清單便會出現。

當您使用 ElementHost 進行設計時,Windows Forms 設計工具會使用專案 obj 資料夾內 Debug 或 Release 資料夾中產生的檔案。如果您刪除這些檔案,設計階段錯誤清單便會出現。若要修正這個問題,請重建專案。如需詳細資訊,請參閱 Windows Form 設計工具的設計階段錯誤

ElementHost 和 IME

裝載在 ElementHost 中的 WPF 控制項目前不支援 ImeMode 屬性。裝載的控制項會忽略 ImeMode

請參閱

工作

HOW TO:在混合應用程式中啟用視覺化樣式

概念

Windows Form 和 WPF 互通性輸入架構

WindowsFormsHost 項目的配置考量

Windows Form 和 WPF 屬性對應

Windows Form 設計工具的設計階段錯誤

參考

ElementHost

WindowsFormsHost

其他資源

WPF 設計工具的互通性

移轉和互通性