次の方法で共有


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

このトピックでは、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 要素から派生します。 他の相互運用のトピックでアダプターへの参照が示されている場合は、このコンテナーについて説明されています。

入れ子

ElementHost コントロールの内部に WindowsFormsHost 要素を入れ子にすることは、サポートされていません。 WindowsFormsHost 要素の内部に ElementHost コントロールを入れ子にすることも、サポートされていません。

フォーカス

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

データの検証も、フォーカスによって影響を受けます。 WindowsFormsHost 要素内では検証は機能しますが、Tab キーを使用して 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 メッセージ ループに追加されます。 メッセージのターゲットになっていた System.Windows.Forms.Control によってメッセージが変換およびディスパッチされる場合、このフィルターでは Control.PreProcessMessage メソッドが呼び出されます。

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

不透明度とレイヤー化

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

Dispose

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

視覚スタイルを有効にする

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

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

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

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

WPF デザイナー

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

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

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

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

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

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

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

ElementHost と IME

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

関連項目