次の方法で共有


ハイブリッド アプリケーションのトラブルシューティング

このトピックでは、WPF と Windows フォームの両方のテクノロジを使用するハイブリッド アプリケーションを作成するときに発生する可能性のある一般的な問題について説明します。

コントロールの重なり

コントロールは、想定どおりに重複しない可能性があります。 Windows フォームでは、コントロールごとに個別の HWND が使用されます。 WPF では、ページ上のすべてのコンテンツに対して 1 つの HWND が使用されます。 この実装の違いにより、予期しない重複する動作が発生します。

WPF でホストされている Windows フォーム コントロールは、常に WPF コンテンツの上に表示されます。

ElementHost コントロールでホストされている WPF コンテンツは、ElementHost コントロールの z オーダーで表示されます。 ElementHostコントロールを重ねてもかまいませんが、ホストされている WPF コンテンツは結合または対話しません。

子プロパティ

WindowsFormsHostクラスとElementHost クラスは、1 つの子コントロールまたは要素のみをホストできます。 複数のコントロールまたは要素をホストするには、子コンテンツとしてコンテナーを使用する必要があります。 たとえば、Windows フォーム ボタンとチェック ボックス コントロールを System.Windows.Forms.Panel コントロールに追加し、パネルを WindowsFormsHost コントロールの Child プロパティに割り当てることができます。 ただし、ボタン コントロールとチェック ボックス コントロールを同じ WindowsFormsHost コントロールに個別に追加することはできません。

スケーリング

WPF フォームと Windows フォームには、異なるスケーリング モデルがあります。 WPF のスケーリング変換の中には、Windows フォーム コントロールにとって意味のあるものもあれば、そうでないものもあります。 たとえば、Windows フォーム コントロールを 0 にスケーリングすると機能しますが、同じコントロールを 0 以外の値にスケールバックしようとすると、コントロールのサイズは 0 のままです。 詳細については、「 WindowsFormsHost 要素のレイアウトに関する考慮事項」を参照してください。

アダプタ

非表示のコンテナーが含まれているため、 WindowsFormsHost クラスと ElementHost クラスを操作するときに混乱が発生する可能性があります。 WindowsFormsHostクラスとElementHost クラスの両方に、コンテンツのホストに使用するアダプターと呼ばれる非表示のコンテナーがあります。 WindowsFormsHost要素の場合、アダプターは System.Windows.Forms.ContainerControl クラスから派生します。 ElementHost コントロールの場合、アダプターは DockPanel 要素から派生します。 他の相互運用に関するトピックでアダプターへの参照が表示される場合は、このコンテナーについて説明します。

入れ子

WindowsFormsHost コントロール内のElementHost要素の入れ子はサポートされていません。 ElementHost要素内のWindowsFormsHost コントロールの入れ子もサポートされていません。

焦点

フォーカスは WPF フォームと Windows フォームでは動作が異なります。つまり、ハイブリッド アプリケーションでフォーカスの問題が発生する可能性があります。 たとえば、 WindowsFormsHost 要素内にフォーカスがあり、ページを最小化して復元したり、モーダル ダイアログ ボックスを表示したりすると、 WindowsFormsHost 要素内のフォーカスが失われる可能性があります。 WindowsFormsHost要素にはフォーカスがありますが、その中のコントロールにはフォーカスがない可能性があります。

データの検証もフォーカスの影響を受けます。 検証は WindowsFormsHost 要素で機能しますが、 WindowsFormsHost 要素からタブアウトしたり、2 つの異なる WindowsFormsHost 要素間でタブ移動したりしても機能しません。

プロパティ マッピング

一部のプロパティ マッピングでは、WPF と Windows フォーム テクノロジの間で異なる実装をブリッジするために広範な解釈が必要です。 プロパティ マッピングを使用すると、コードはフォント、色、およびその他のプロパティの変更に対応できます。 一般に、プロパティ マッピングは、 PropertyChanged イベントまたは OnPropertyChanged の呼び出しをリッスンし、子コントロールまたはそのアダプターに適切なプロパティを設定することで機能します。 詳細については、「 Windows フォームと WPF プロパティ マッピング」を参照してください。

WindowsFormsHost.ChildまたはElementHost.Childプロパティが割り当てられると、ホストされているコンテンツに対して複数のレイアウト関連プロパティが自動的に設定されます。 これらのコンテンツ プロパティを変更すると、予期しないレイアウト動作が発生する可能性があります。

ホストされているコンテンツが配置され、WindowsFormsHostElementHost の親を満たします。 この塗りつぶしの動作を有効にするには、子プロパティを設定するときにいくつかのプロパティが設定されます。 次の表に、 ElementHost クラスと WindowsFormsHost クラスによって設定されるコンテンツ プロパティを示します。

ホスト クラス コンテンツのプロパティ
ElementHost Height

Width

Margin

VerticalAlignment

HorizontalAlignment
WindowsFormsHost Margin

Dock

AutoSize

Location

MaximumSize

これらのプロパティは、ホストされているコンテンツに直接設定しないでください。 詳細については、「 WindowsFormsHost 要素のレイアウトに関する考慮事項」を参照してください。

ナビゲーション アプリケーションでは、ユーザーの状態が維持されない場合があります。 WindowsFormsHost要素は、ナビゲーション アプリケーションで使用されるときにコントロールを再作成します。 子コントロールの再作成は、ユーザーが WindowsFormsHost 要素をホストしているページから移動し、そのページに戻ったときに発生します。 ユーザーによって入力されたすべてのコンテンツは失われます。

メッセージ ループの相互運用

Windows フォーム メッセージ ループを使用する場合、メッセージが想定どおりに処理されない可能性があります。 EnableWindowsFormsInterop メソッドは、WindowsFormsHost コンストラクターによって呼び出されます。 このメソッドは、WPF メッセージ ループにメッセージ フィルターを追加します。 このフィルターは、Control.PreProcessMessageがメッセージのターゲットであった場合にSystem.Windows.Forms.Control メソッドを呼び出し、メッセージを翻訳/ディスパッチします。

Windowを使用して Windows フォーム メッセージ ループにApplication.Runを表示する場合は、EnableModelessKeyboardInterop メソッドを呼び出さない限り、何も入力できません。 EnableModelessKeyboardInterop メソッドはWindowを受け取り、キー関連のメッセージを WPF メッセージ ループに再ルーティングするSystem.Windows.Forms.IMessageFilterを追加します。 詳細については、「 Windows フォームと WPF 相互運用性入力アーキテクチャ」を参照してください。

不透明度とレイヤー

HwndHost クラスは、階層化をサポートしていません。 つまり、Opacity要素にWindowsFormsHost プロパティを設定しても効果はなく、AllowsTransparencyに設定true他の WPF ウィンドウとのブレンドは行われません。

廃棄

クラスを適切に破棄しないと、リソースがリークする可能性があります。 ハイブリッド アプリケーションで、 WindowsFormsHost クラスと ElementHost クラスが破棄されているか、リソースがリークする可能性があることを確認します。 Windows フォームでは、非モーダル ElementHost親が閉じると、Form コントロールが破棄されます。 WPF は、アプリケーションのシャットダウン時 WindowsFormsHost 要素を破棄します。 Windows フォーム メッセージ ループ内のWindowsFormsHostWindow要素を表示できます。 この場合、アプリケーションがシャットダウン中であるという通知がコードで受信されない場合があります。

ビジュアルスタイルの有効化

Windows フォーム コントロールの Microsoft Windows XP ビジュアル スタイルが有効になっていない可能性があります。 Application.EnableVisualStyles メソッドは、Windows フォーム アプリケーションのテンプレートで呼び出されます。 このメソッドは既定では呼び出されませんが、Visual Studio を使用してプロジェクトを作成する場合、バージョン 6.0 の Comctl32.dll が使用可能な場合は、コントロールの Microsoft Windows XP ビジュアル スタイルが表示されます。 スレッドでハンドルが作成される前に、 EnableVisualStyles メソッドを呼び出す必要があります。 詳細については、「 方法: ハイブリッド アプリケーションでビジュアル スタイルを有効にする」を参照してください。

ライセンスされたコントロール

ユーザーにメッセージ ボックスにライセンス情報を表示するライセンス付き Windows フォーム コントロールは、ハイブリッド アプリケーションで予期しない動作を引き起こす可能性があります。 一部のライセンスコントロールでは、ハンドルの作成に応答してダイアログ ボックスが表示されます。 たとえば、ライセンスされたコントロールは、ライセンスが必要であることをユーザーに通知したり、ユーザーがコントロールの残りの 3 つの試用版を使用していることを通知したりする場合があります。

WindowsFormsHost要素はHwndHost クラスから派生し、子コントロールのハンドルは BuildWindowCore メソッド内に作成されます。 HwndHost クラスでは、BuildWindowCore メソッドでメッセージを処理することはできませんが、ダイアログ ボックスを表示するとメッセージが送信されます。 このライセンス シナリオを有効にするには、Control.CreateControl要素の子として割り当てる前に、コントロールのWindowsFormsHost メソッドを呼び出します。

WPF デザイナー

WPF デザイナー for Visual Studio を使用して WPF コンテンツを設計できます。 次のセクションでは、WPF デザイナーを使用してハイブリッド アプリケーションを作成するときに発生する可能性がある一般的な問題について説明します。

デザイン時に BackColorTransparent が無視される

BackColorTransparent プロパティは、デザイン時に期待どおりに動作しない可能性があります。

WPF コントロールが参照可能な親にない場合、WPF ランタイムは BackColorTransparent 値を無視します。 BackColorTransparentが無視される理由は、ElementHostオブジェクトが別のAppDomainに作成されるためです。 ただし、アプリケーションを実行すると、 BackColorTransparent は想定どおりに動作します。

obj フォルダーが削除されたときにデザイン時エラー一覧が表示される

obj フォルダーが削除されると、デザイン時エラー一覧が表示されます。

ElementHostを使用して設計する場合、Windows フォーム デザイナーでは、プロジェクトの obj フォルダー内の [デバッグ] フォルダーまたは [リリース] フォルダーに生成されたファイルが使用されます。 これらのファイルを削除すると、デザイン時エラー一覧が表示されます。 この問題を解決するには、プロジェクトをリビルドします。 詳細については、「 Windows フォーム デザイナーのDesign-Time エラー」を参照してください。

ElementHost と IME

現在、 ElementHost でホストされている WPF コントロールは、 ImeMode プロパティをサポートしていません。 ImeModeへの変更は、ホストされているコントロールによって無視されます。

こちらも参照ください