WPF と Windows フォームの相互運用
WPF フォームと Windows フォームには、アプリケーション インターフェイスを作成するための 2 つの異なるアーキテクチャが用意されています。 System.Windows.Forms.Integration 名前空間は、一般的な相互運用シナリオを可能にするクラスを提供します。 相互運用機能を実装する 2 つの主要なクラスは、WindowsFormsHost と ElementHostです。 このトピックでは、サポートされている相互運用シナリオと、サポートされていないシナリオについて説明します。
手記
ハイブリッド制御の シナリオには特別な考慮事項があります。 ハイブリッド コントロールには、あるテクノロジーのコントロールが、もう一方のテクノロジーのコントロールに内包されています。 これは、入れ子になった相互運用とも呼ばれます。 マルチレベル ハイブリッド コントロール には、複数のレベルのハイブリッド コントロールの入れ子があります。 複数レベルの入れ子になった相互運用の例として、別の Windows フォーム コントロールを含む WPF コントロールを含む Windows フォーム コントロールがあります。 マルチレベル ハイブリッド コントロールはサポートされていません。
WPF での Windows フォーム コントロールのホスト
WPF コントロールが Windows フォーム コントロールをホストする場合、次の相互運用シナリオがサポートされます。
WPF コントロールは、XAML を使用して 1 つ以上の Windows フォーム コントロールをホストできます。
コードを使用して 1 つ以上の Windows フォーム コントロールをホストできます。
他の Windows フォーム コントロールを含む Windows フォーム コンテナー コントロールをホストできます。
WPF マスターと Windows フォームの詳細を含むマスター/詳細フォームをホストできます。
Windows フォームのマスターと WPF の詳細を含むマスター/詳細フォームをホストできます。
1 つ以上の ActiveX コントロールをホストできます。
1 つ以上の複合コントロールをホストできます。
拡張アプリケーション マークアップ言語 (XAML) を使用してハイブリッド コントロールをホストする場合があります。
コードを使用してハイブリッド コントロールをホストする場合があります。
レイアウトのサポート
次の一覧では、WindowsFormsHost 要素がホストされている Windows フォーム コントロールを WPF レイアウト システムに統合しようとしたときの既知の制限事項について説明します。
場合によっては、Windows フォーム コントロールのサイズを変更できないか、特定のディメンションのみにサイズを設定できます。 たとえば、Windows フォーム ComboBox コントロールでは、コントロールのフォント サイズによって定義される 1 つの高さのみがサポートされます。 要素を垂直方向に拡張できることを前提とする WPF 動的レイアウトでは、ホストされた ComboBox コントロールは想定どおりに拡張されません。
Windows フォーム コントロールを回転または傾斜させることはできません。 たとえば、ユーザー インターフェイスを 90 度回転させると、ホストされている Windows フォーム コントロールは直立した位置を維持します。
ほとんどの場合、Windows フォーム コントロールは比例スケーリングをサポートしていません。 コントロールの全体的なディメンションはスケーリングされますが、コントロールの子コントロールとコンポーネント要素のサイズが想定どおりに変更されない場合があります。 この制限は、各 Windows フォーム コントロールがスケーリングをどの程度サポートしているかによって異なります。
WPF ユーザー インターフェイスでは、要素の z オーダーを変更して、重複する動作を制御できます。 ホストされている Windows フォーム コントロールは別の HWND に描画されるため、WPF 要素の上に常に描画されます。
Windows フォーム コントロールでは、フォント サイズに基づく自動スケールがサポートされます。 WPF ユーザー インターフェイスでは、フォント サイズを変更してもレイアウト全体のサイズは変更されませんが、個々の要素のサイズは動的に変更される可能性があります。
環境プロパティ
WPF コントロールのアンビエント プロパティの一部には、Windows フォームに相当するものがあります。 これらのアンビエント プロパティは、ホストされている Windows フォーム コントロールに伝達され、WindowsFormsHost コントロールのパブリック プロパティとして公開されます。 WindowsFormsHost コントロールは、各 WPF アンビエント プロパティを同等の Windows フォームに変換します。
詳細については、「Windows フォームと WPF プロパティ マッピングの」を参照してください。
行動
次の表では、相互運用動作について説明します。
行動 | 対応 | サポートされていません |
---|---|---|
透明性 | Windows フォーム コントロールのレンダリングでは、透明度がサポートされます。 親 WPF コントロールの背景は、ホストされている Windows フォーム コントロールの背景になる可能性があります。 | 一部の Windows フォーム コントロールでは、透明度がサポートされていません。 たとえば、WPF でホストされている場合、TextBox コントロールと ComboBox コントロールは透過的になりません。 |
タブ挿入 | ホストされている Windows フォーム コントロールのタブ オーダーは、これらのコントロールが Windows フォーム ベースのアプリケーションでホストされている場合と同じです。 WPF コントロールから Windows Forms コントロールに Tab キーや SHIFT+TAB キーを使った移動は通常どおりに動作します。 false の TabStop プロパティ値を持つ Windows フォーム コントロールは、ユーザーがコントロールを介してタブ移動するときにフォーカスを受け取りません。- 各 WindowsFormsHost コントロールには TabIndex 値があり、その WindowsFormsHost コントロールがフォーカスを受け取るタイミングを決定します。 - WindowsFormsHost コンテナー内に含まれる Windows フォーム コントロールは、TabIndex プロパティで指定された順序に従います。 最後のタブ インデックスからタブ移動すると、次の WPF コントロールが存在する場合にフォーカスが移動します。 他のフォーカス可能な WPF コントロールが存在しない場合、タブ移動はタブ オーダーで最初の Windows フォーム コントロールに戻ります。 WindowsFormsHost 内のコントロールの - TabIndex 値は、WindowsFormsHost コントロールに含まれる兄弟 Windows フォーム コントロールに対する相対値です。 - タブ処理では、コントロール固有の動作が優先されます。 たとえば、AcceptsTab プロパティ値が true の TextBox コントロールで Tab キーを押すと、フォーカスを移動するのではなく、テキスト ボックスにタブが入力されます。 |
適用されません。 |
方向キーを使用したナビゲーション | - WindowsFormsHost コントロールの方向キーを使用したナビゲーションは、通常の Windows フォーム コンテナー コントロールと同じです。上方向キーと左方向キーは前のコントロールを選択し、下方向キーと右方向キーは次のコントロールを選択します。 - WindowsFormsHost コントロールに含まれる最初のコントロールの上方向キーと左方向キーは、Shift + TAB キーボード ショートカットと同じ操作を実行します。 フォーカス可能な WPF コントロールがある場合、フォーカスは WindowsFormsHost コントロールの外側に移動します。 この動作は、最後のコントロールへの折り返しが発生しないという点で、標準の ContainerControl 動作とは異なります。 他のフォーカス可能な WPF コントロールが存在しない場合、フォーカスはタブ オーダーで最後の Windows フォーム コントロールに戻ります。 - WindowsFormsHost コントロールに含まれる最後のコントロールの下方向キーと右方向キーは、TAB キーと同じアクションを実行します。 フォーカス可能な WPF コントロールがある場合、フォーカスは WindowsFormsHost コントロールの外側に移動します。 この動作は、最初のコントロールへの折り返しが発生しないという点で、標準の ContainerControl 動作とは異なります。 他のフォーカス可能な WPF コントロールが存在しない場合、フォーカスはタブ オーダーで最初の Windows フォーム コントロールに戻ります。 |
適用されません。 |
アクセラレータ | アクセラレータは、"サポートされていません" 列に記載されている場合を除き、通常どおりに動作します。 | テクノロジ間のアクセラレータの重複は、通常の重複アクセラレータのように機能しません。 テクノロジ間でアクセラレータが複製され、Windows フォーム コントロールに少なくとも 1 つ、WPF コントロールにもう 1 つがある場合、Windows フォーム コントロールは常にアクセラレータを受け取ります。 重複するアクセラレータが押されたときに、コントロール間でフォーカスが切り替わりません。 |
ショートカット キー | ショートカット キーは、"サポートされていません" 列に記載されている場合を除き、通常どおりに機能します。 | - 前処理段階で処理される Windows フォームのショートカット キーは、常に WPF ショートカット キーよりも優先されます。 たとえば、Ctrl + S ショートカット キーが定義された ToolStrip コントロールがあり、CTRL + S にバインドされた WPF コマンドがある場合、フォーカスに関係なく、ToolStrip コントロール ハンドラーが常に最初に呼び出されます。 - KeyDown イベントによって処理される Windows フォームのショートカット キーは、WPF で最後に処理されます。 この動作を防ぐには、Windows フォーム コントロールの IsInputKey メソッドをオーバーライドするか、PreviewKeyDown イベントを処理します。 IsInputKey メソッドから true を返すか、PreviewKeyDownEventArgs.IsInputKey プロパティの値を PreviewKeyDown イベント ハンドラーで true するように設定します。 |
AcceptsReturn、AcceptsTab、およびその他のコントロール固有の動作 | 既定のキーボード動作を変更するプロパティは、Windows フォーム コントロールが IsInputKey メソッドをオーバーライドして true を返す場合を想定して、通常どおりに動作します。 |
KeyDown イベントを処理することによって既定のキーボード動作を変更する Windows フォーム コントロールは、ホスト WPF コントロールで最後に処理されます。 これらのコントロールは最後に処理されるため、予期しない動作が発生する可能性があります。 |
入室イベントと退室イベント | フォーカスが含まれる ElementHost コントロールにフォーカスが移動しない場合、1 つの WindowsFormsHost コントロールでフォーカスが変更されると、Enter イベントと Leave イベントが通常どおりに発生します。 | 次のようなフォーカスの変更があるときには、Enter イベントと Leave イベントは発生しません。 - WindowsFormsHost コントロールの内側から外側へ。 - WindowsFormsHost コントロールの外側から内側へ。 - WindowsFormsHost コントロールの外にある。 - WindowsFormsHost コントロールでホストされている Windows フォーム コントロールから、同じ WindowsFormsHost内でホストされている ElementHost コントロールまで。 |
マルチスレッド | すべての種類のマルチスレッドがサポートされています。 | Windows フォームと WPF の両方のテクノロジでは、シングル スレッドのコンカレンシー モデルが想定されています。 デバッグ中に、他のスレッドからフレームワーク オブジェクトを呼び出すと、この要件を適用するために例外が発生します。 |
安全 | すべての相互運用シナリオでは、完全な信頼が必要です。 | 部分信頼では相互運用シナリオは許可されません。 |
アクセシビリティ | すべてのアクセシビリティ シナリオがサポートされています。 支援技術製品は、Windows フォームと WPF コントロールの両方を含むハイブリッド アプリケーションで使用される場合に正しく機能します。 | 適用されません。 |
クリップボード | すべてのクリップボード操作は通常どおりに動作します。 これには、Windows フォームと WPF コントロール間の切り取りと貼り付けが含まれます。 | 適用されません。 |
ドラッグ アンド ドロップ機能 | すべてのドラッグ アンド ドロップ操作は通常どおりに動作します。 これには、Windows フォームと WPF コントロール間の操作が含まれます。 | 適用されません。 |
Windows フォームでの WPF コントロールのホスト
Windows フォーム コントロールが WPF コントロールをホストする場合、次の相互運用シナリオがサポートされます。
コードを使用して 1 つ以上の WPF コントロールをホストする。
プロパティ シートを 1 つ以上のホストされた WPF コントロールに関連付けます。
1 つ以上の WPF ページをフォームでホストする。
WPF ウィンドウを起動する。
Windows フォーム マスターと WPF の詳細を使用したマスター/詳細フォームのホスト。
WPF マスターと Windows フォームの詳細を使用したマスター/詳細フォームのホスト。
カスタム WPF コントロールのホスト。
ハイブリッド コントロールのホスト。
環境特性
Windows フォーム コントロールのアンビエント プロパティの中には、WPF に相当するものがあります。 これらのアンビエント プロパティは、ホストされている WPF コントロールに伝達され、ElementHost コントロールのパブリック プロパティとして公開されます。 ElementHost コントロールは、各 Windows フォームアンビエント プロパティを同等の WPF に変換します。
詳細については、「Windows フォームと WPF プロパティ マッピングの」を参照してください。
行動
次の表では、相互運用動作について説明します。
行動 | 対応 | サポートされていません |
---|---|---|
透明性 | WPF コントロールのレンダリングでは、透過性がサポートされています。 親 Windows フォーム コントロールの背景は、ホストされている WPF コントロールの背景になる可能性があります。 | 適用されません。 |
マルチスレッド | すべての種類のマルチスレッドがサポートされています。 | Windows フォームと WPF の両方のテクノロジでは、シングル スレッドのコンカレンシー モデルが想定されています。 デバッグ中に、他のスレッドからフレームワーク オブジェクトを呼び出すと、この要件を適用するために例外が発生します。 |
安全 | すべての相互運用シナリオでは、完全な信頼が必要です。 | 部分信頼では相互運用シナリオは許可されません。 |
アクセシビリティ | すべてのアクセシビリティ シナリオがサポートされています。 支援技術製品は、Windows フォームと WPF コントロールの両方を含むハイブリッド アプリケーションで使用される場合に正しく機能します。 | 適用されません。 |
クリップボード | すべてのクリップボード操作は通常どおりに動作します。 これには、Windows フォームと WPF コントロール間の切り取りと貼り付けが含まれます。 | 適用されません。 |
ドラッグ アンド ドロップ機能 | すべてのドラッグ アンド ドロップ操作は通常どおりに動作します。 これには、Windows フォームと WPF コントロール間の操作が含まれます。 | 適用されません。 |
参照
- ElementHost
- WindowsFormsHost
- チュートリアル: WPF での Windows フォーム コントロールのホスト
- チュートリアル: WPF での Windows フォーム複合コントロールのホスト
- チュートリアル: Windows フォームでの WPF 複合コントロールのホスト
- Windows フォームと WPF プロパティ マッピング
.NET Desktop feedback