WPF と Windows フォームの相互運用性

WPF と Windows Formsは、アプリケーション インターフェイスを作成するための 2 つの異なるアーキテクチャを提供します。 System.Windows.Forms.Integration 名前空間は、共通の相互運用シナリオを可能にするクラスを提供します。 相互運用機能を実装する 2 つの主要クラスは、WindowsFormsHostElementHost です。 ここでは、サポートされる相互運用シナリオと、サポートされないシナリオについて説明します。

メモメモ

ハイブリッド コントロール シナリオには特に注意する必要があります。ハイブリッド コントロールは、あるテクノロジのコントロールの入れ子になっている別のテクノロジのコントロールです。これは、入れ子になった相互運用とも呼ばれます。複数レベルのハイブリッド コントロールには、複数のレベルで入れ子になっているハイブリッド コントロールが含まれます。複数レベルの入れ子になった相互運用の例として、ある Windows Forms コントロールに WPF コントロールが含まれ、さらにそのコントロールに Windows Forms コントロールが含まれている場合があります。複数レベルのハイブリッド コントロールはサポートされていません。

このトピックは、次のセクションで構成されています。

  • WPF での Windows フォーム コントロールのホスト
  • Windows フォームでの WPF コントロールのホスト
  • 関連トピック

WPF での Windows フォーム コントロールのホスト

次の相互運用のシナリオは、WPF コントロールが Windows Forms コントロールをホストする場合にサポートされます。

  • WPF コントロールは、XAML を使用して 1 つ以上の Windows Forms コントロールをホストできます。

  • コードを使用して 1 つ以上の Windows Forms コントロールをホストできます。

  • 他の Windows Forms コントロールを含む Windows Forms コンテナー コントロールをホストできます。

  • WPF マスターおよび Windows Forms 詳細を使用して、マスター/詳細フォームをホストできます。

  • Windows Forms マスターおよび WPF 詳細を使用して、マスター/詳細フォームをホストできます。

  • 1 つ以上の ActiveX コントロールをホストできます。

  • 1 つ以上の複合コントロールをホストできます。

  • Extensible Application Markup Language (XAML) を使用してハイブリッド コントロールをホストできます。

  • コードを使用してハイブリッド コントロールをホストできます。

レイアウトのサポート

WindowsFormsHost 要素がホストされている Windows Forms コントロールを WPF のレイアウト システムに統合する際の既知の制限を次のリストに示します。

  • Windows Forms コントロールは、サイズを変更できなかったり、特定のサイズにしか設定できない場合があります。 たとえば、Windows Forms ComboBox コントロールは、コントロールのフォント サイズで定義されている 1 つの高さしかサポートしていません。 要素を垂直方向に伸縮できると想定される、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 フォームと WPF プロパティの割り当て」を参照してください。

動作

相互運用動作の説明を次の表に示します。

動作

サポート状況

サポートなし

透過性

Windows Forms コントロールのレンダリングは透過性をサポートします。 WPF の親コントロールの背景を、ホストしている Windows Forms コントロールの背景にすることができます。

一部の Windows Forms コントロールは、透過性をサポートしません。 たとえば、TextBox コントロールと ComboBox コントロールは、WPF でホストされている場合、透明になりません。

Tab キーによる移動

ホストされている Windows Forms コントロールのタブ オーダーは、それらのコントロールが Windows Forms ベースのアプリケーションでホストされている場合と同じです。

Tab キーおよび Shift + Tab キーを使用した WPF コントロールから Windows Forms コントロールへの Tab キーによる移動は、通常どおり動作します。

TabStop プロパティの値が false になっている Windows Forms コントロールは、ユーザーがコントロール間を Tab キーで移動しても、フォーカスを受け取りません。

  • WindowsFormsHost コントロールは TabIndex 値を持ちます。この値は、WindowsFormsHost コントロールがフォーカスを受け取るタイミングを決定します。

  • WindowsFormsHost コンテナー内に含まれている Windows Forms コントロールは、TabIndex プロパティで指定されたタブ オーダーに従います。 最後のタブ インデックスで Tab キーを押すと、次の WPF コントロール (存在する場合) にフォーカスが移ります。 他にフォーカスを取得できる WPF コントロールが存在しない場合、Tab キーを押すと、タブ オーダーの最初の Windows Forms コントロールに移動します。

  • WindowsFormsHost 内のコントロールの TabIndex 値は、WindowsFormsHost コントロールに含まれている兄弟 Windows Forms コントロールを基準にします。

  • Tab キーによる移動は、コントロール固有の動作に従います。 たとえば、AcceptsTab プロパティの値が true になっている TextBox コントロールで Tab キーを押すと、フォーカスが移動するのではなく、テキスト ボックス内にタブが入力されます。

適用なし。

方向キーによるナビゲーション

  • WindowsFormsHost コントロールでの方向キーによるナビゲーションは、通常の Windows Forms コンテナー コントロールと同じです。上方向キーと左方向キーは前のコントロールを選択し、下方向キーと右方向キーは次のコントロールを選択します。

  • WindowsFormsHost コントロールに含まれている最初のコントロールで上方向キーと左方向キーを押すと、Shift + Tab キーボード ショートカットと同じアクションが実行されます。 フォーカスを取得できる WPF コントロールが存在する場合は、フォーカスは WindowsFormsHost コントロール外に移動します。 この動作は、最後のコントロールに折り返されないという点で、標準の ContainerControl の動作とは異なります。 他にフォーカスを取得できる WPF コントロールが存在しない場合、フォーカスはタブ オーダーの最後の Windows Forms コントロールに戻ります。

  • WindowsFormsHost コントロールに含まれている最後のコントロールで下方向キーと右方向キーを押すと、Tab キーと同じアクションが実行されます。 フォーカスを取得できる WPF コントロールが存在する場合は、フォーカスは WindowsFormsHost コントロール外に移動します。 この動作は、最初のコントロールに折り返されないという点で、標準の ContainerControl の動作とは異なります。 他にフォーカスを取得できる WPF コントロールが存在しない場合、フォーカスはタブ オーダーの最初の Windows Forms コントロールに戻ります。

適用なし。

アクセラレータ

アクセラレータは、"サポートなし" 列に示されている場合を除き、通常どおり動作します。

テクノロジ間で重複するアクセラレータは、通常の重複するアクセラレータのようには動作しません。 アクセラレータがテクノロジ間で重複する場合、つまり、Windows Forms コントロールに 1 つ以上、および WPF コントロールにも他のアクセラレータがある場合は、Windows Forms コントロールはアクセラレータを常に受け取ります。 重複するアクセラレータ キーが押された場合、フォーカスはコントロール間で切り替わりません。

ショートカット キー

ショートカット キーは、"サポートなし" 列に示されている場合を除き、通常どおり動作します。

  • 事前処理段階で処理される Windows Forms ショートカット キーは常に WPF ショートカット キーよりも優先されます。 たとえば、Ctrl + S ショートカット キーが定義されている ToolStrip コントロールがあり、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 コントロールにフォーカスが移動しない場合に、フォーカスが 1 つの WindowsFormsHost コントロールで変更されると、Enter イベントと Leave イベントは通常どおり発生します。

Enter イベントと Leave イベントは、次のフォーカスの変更が行われるまで発生しません。

マルチスレッド

あらゆる種類のマルチスレッドがサポートされます。

Windows Forms と WPF の両方のテクノロジでは、シングルスレッドの同時実行モデルを前提にしています。 デバッグ中は、他のスレッドからフレームワーク オブジェクトを呼び出すと例外が発生し、この要件が強制されます。

セキュリティ

すべての相互運用シナリオには完全な信頼が必要です。

相互運用シナリオは、部分的な信頼ではサポートされません。

ユーザー補助

すべてのアクセシビリティ シナリオがサポートされます。 支援技術製品は、Windows Forms と WPF の両方のコントロールを含むハイブリッド アプリケーションで使用すると正しく動作します。

適用できません。

クリップボード

すべてのクリップボードは通常どおり操作できます。 これには、Windows Forms コントロールと WPF コントロール間の切り取りと貼り付けも含まれます。

適用できません。

ドラッグ アンド ドロップ機能

すべてのドラッグ アンド ドロップは通常どおり操作できます。 これには、Windows Forms コントロールと WPF コントロール間の操作も含まれます。

適用なし。

Windows フォームでの WPF コントロールのホスト

次の相互運用のシナリオは、Windows Forms コントロールが WPF コントロールをホストする場合にサポートされます。

  • コードを使用して 1 つ以上の WPF コントロールをホストする。

  • プロパティ シートを 1 つ以上のホストされている WPF コントロールに関連付ける。

  • フォームで 1 つ以上の WPF ページをホストする。

  • WPF ウィンドウを起動する。

  • Windows Forms マスターおよび WPF 詳細を使用したマスター/詳細フォームのホスト。

  • WPF マスターおよび Windows Forms 詳細を使用したマスター/詳細フォームのホスト。

  • カスタム WPF コントロールをホストする。

  • ハイブリッド コントロールをホストする。

アンビエント プロパティ

Windows Forms コントロールの一部のアンビエント プロパティは、WPF と同等の機能があります。 これらのアンビエント プロパティは、ホストされている WPF コントロールに適用され、ElementHost コントロールのパブリック プロパティとして公開されます。 ElementHost コントロールは、各 Windows Forms アンビエント プロパティをその WPF の等価プロパティに変換します。

詳細については、「Windows フォームと WPF プロパティの割り当て」を参照してください。

動作

相互運用動作の説明を次の表に示します。

動作

サポート状況

サポートなし

透過性

WPF コントロールのレンダリングは透過性をサポートします。 Windows Forms の親コントロールの背景を、ホストしている WPF コントロールの背景にすることができます。

適用なし。

マルチスレッド

あらゆる種類のマルチスレッドがサポートされます。

Windows Forms と WPF の両方のテクノロジでは、シングルスレッドの同時実行モデルを前提にしています。 デバッグ中は、他のスレッドからフレームワーク オブジェクトを呼び出すと例外が発生し、この要件が強制されます。

セキュリティ

すべての相互運用シナリオには完全な信頼が必要です。

相互運用シナリオは、部分的な信頼ではサポートされません。

ユーザー補助

すべてのアクセシビリティ シナリオがサポートされます。 支援技術製品は、Windows Forms と WPF の両方のコントロールを含むハイブリッド アプリケーションで使用すると正しく動作します。

適用できません。

クリップボード

すべてのクリップボードは通常どおり操作できます。 これには、Windows Forms コントロールと WPF コントロール間の切り取りと貼り付けも含まれます。

適用できません。

ドラッグ アンド ドロップ機能

すべてのドラッグ アンド ドロップは通常どおり操作できます。 これには、Windows Forms コントロールと WPF コントロール間の操作も含まれます。

適用できません。

参照

処理手順

チュートリアル: WPF での Windows フォーム コントロールのホスト

参照

ElementHost

WindowsFormsHost

概念

チュートリアル: WPF での Windows フォーム複合コントロールのホスト

チュートリアル: Windows フォームでの WPF 複合コントロールのホスト

Windows フォームと WPF プロパティの割り当て