次の方法で共有


WindowsFormsHost 要素のレイアウトに関する考慮事項

このトピックでは、WindowsFormsHost 要素と WPF レイアウト システムのやりとりについて説明します。

WPF と Windows フォームは、フォームまたはページ上の要素のサイズ変更と配置について、異なる点はありますが、類似したロジックをサポートしています。 WPF で Windows フォーム コントロールをホストするハイブリッド ユーザー インターフェイス (UI) を作成する場合、WindowsFormsHost 要素を使用して、この 2 つのレイアウト スキームを統合します。

WPF と Windows フォームのレイアウトの違い

WPF で使用するレイアウトは、解像度に依存しません。 WPF レイアウトのすべての寸法は、"デバイス非依存ピクセル" を使用して指定します。 デバイス非依存ピクセルは、サイズが 96 分の 1 インチであり、解像度に依存しません。そのため、レンダリング先が 72 dpi モニターか 19,200 dpi プリンターかに関係なく、同様の結果が得られます。

また、WPF は "動的レイアウト" に基づいています。 つまり、そのコンテンツ、その親レイアウト コンテナー、および使用できる画面サイズに応じて、UI 要素はフォームまたはページ上に自動的に配置されます。 動的レイアウトを使用すると、含まれる文字列の長さが変化したときに、UI 要素のサイズと位置が自動的に調整されるので、ローカリゼーションが容易になります。

Windows フォームのレイアウトはデバイスに依存し、静的である可能性が高くなります。 通常、Windows フォーム コントロールは、ハードウェア ピクセルで指定された寸法を使用して、フォーム上に絶対配置されます。 ただし、Windows フォームは、次の表に示すように、いくつかの動的レイアウト機能をサポートしています。

レイアウト機能 説明
自動サイズ調整 一部の Windows フォーム コントロールは、コンテンツを適切に表示するために自動的にサイズが変更されます。 詳細については、「AutoSize プロパティの概要」を参照してください。
固定とドッキング Windows フォーム コントロールは、親コンテナーに基づく配置とサイズ変更をサポートします。 詳細については、次のトピックを参照してください。 Control.Anchor および Control.Dock
自動スケール コンテナー コントロールでは、出力デバイスの解像度または既定のコンテナー フォントのサイズ (ピクセル単位) に基づいて自身とその子のサイズが変更されます。 詳細については、「Windows フォームでの自動スケーリング」を参照してください。
レイアウト コンテナー FlowLayoutPanel および TableLayoutPanel コントロールでは、その子コントロールが配置され、コンテンツに応じてサイズが変更されます。

レイアウトの制限事項

一般に、Windows フォーム コントロールを、WPF で可能な範囲にスケーリングおよび変換することはできません。 次の一覧は、WindowsFormsHost 要素を使用して、ホストされている Windows フォーム コントロールを WPF レイアウト システムに統合する際の既知の制限事項について説明しています。

  • 場合によっては、Windows フォーム コントロールのサイズを変更できません。または、特定のサイズにしか限定できません。 たとえば、Windows フォームの ComboBox コントロールでは、コントロールのフォント サイズによって定義される 1 つの高さのみがサポートされます。 WPF の動的レイアウトでは、要素は垂直方向に伸縮できますが、ホストされている ComboBox コントロールは想定どおりに伸縮されません。

  • Windows フォーム コントロールを回転または傾斜させることはできません。 傾斜または回転変換を適用すると、WindowsFormsHost 要素によって LayoutError イベントが発生します。 LayoutError イベントを処理しない場合、InvalidOperationException が発生します。

  • ほとんどの場合、Windows フォーム コントロールでは比率を維持したスケーリングはサポートされていません。 コントロール全体の寸法はスケーリングされますが、コントロールの子コントロールとコンポーネント要素は、想定したとおりにサイズ変更されない可能性があります。 この制限は、各 Windows フォーム コントロールでスケーリングがどの程度サポートされているかによって異なります。 また、Windows フォーム コントロールのサイズを 0 ピクセルに縮小することはできません。

  • Windows フォーム コントロールは、自動スケーリングをサポートしており、フォームとそのコントロールはフォント サイズに基づいて自動的にサイズが変更されます。 WPF のユーザー インターフェイスでは、フォント サイズを変更すると、個々の要素のサイズが動的に変更されても、レイアウト全体のサイズが変更されることはありません。

Z オーダー

WPF のユーザー インターフェイスでは、要素の Z オーダー を変更して、重なり具合を制御できます。 ホストされている Windows フォーム コントロールは別の HWND で描画されるため、常に WPF 要素の上に描画されます。

ホストされている Windows フォーム コントロールも Adorner 要素の上に描画されます。

レイアウト動作

以下のセクションでは、WPF で Windows フォーム コントロールをホストするときのレイアウト動作の特定の側面について説明します。

スケーリング、単位変換、デバイス非依存

WindowsFormsHost 要素を使用して WPF および Windows フォームの寸法を含む操作を実行するときは常に、WPF のデバイス非依存ピクセルと Windows フォームのハードウェア ピクセルの 2 つの座標系を伴います。 そのため、一貫したレイアウトを実現するには、適切な単位変換とスケーリング変換を適用する必要があります。

座標系間の変換は、現在のデバイス解像度と、WindowsFormsHost 要素またはその先祖に適用されたレイアウトまたはレンダリング変換によって変わります。

出力デバイスが 96 dpi であり、WindowsFormsHost 要素にスケーリングが適用されていない場合、1 デバイス非依存ピクルは 1 ハードウェア ピクセルと等しくなります。

それ以外の場合は、座標系のスケーリングが必要です。 ホストされているコントロールはサイズが変更されません。 代わりに、WindowsFormsHost 要素では、ホストされているコントロールとそのすべての子コントロールのスケーリングが試行されます。 Windows フォームはスケーリングを完全にはサポートしていないため、WindowsFormsHost 要素は、特定のコントロールでサポートされる範囲までスケーリングされます。

ホストされている Windows フォーム コントロールにカスタムのスケーリング動作を提供するように、ScaleChild メソッドをオーバーライドします。

スケーリングに加えて、WindowsFormsHost 要素では、次の表に示すように、丸めとオーバーフローのケースが処理されます。

変換の問題 説明
丸め WPF のデバイス非依存ピクセルの寸法は double で指定し、Windows フォームのハードウェア ピクセルの寸法は int で指定します。 doubleベースの寸法が int ベースの寸法に変換される場合、WindowsFormsHost 要素には標準の丸めが使用されるため、0.5 未満の小数値は 0 に切り捨てられます。
オーバーフロー WindowsFormsHost 要素が double 値から int 値に変換されると、オーバーフローが発生する可能性があります。 MaxValue を超える値は MaxValue に設定されます。

Windows フォーム コントロールのレイアウト動作を制御するプロパティと WPF 要素は、WindowsFormsHost 要素によって適切にマップされます。 詳細については、「Windows フォームと WPF プロパティの割り当て」を参照してください。

ホストされているコントロールのレイアウト変更

ホストされている Windows フォーム コントロールのレイアウト変更が WPF に伝達されると、レイアウトの更新がトリガーされます。 WindowsFormsHostInvalidateMeasure メソッドを使用することで、ホストされているコントロールにおけるレイアウトの変更で、WPF レイアウト エンジンが実行されるようにします。

継続的にサイズ変更される Windows フォーム コントロール

連続したスケーリングをサポートする Windows フォーム コントロールで、WPF レイアウト システムと完全にやりとりします。 WindowsFormsHost 要素では、通常どおり、MeasureOverride および ArrangeOverride メソッドを使用して、ホストされている Windows フォーム コントロールのサイズを変更し、配置します。

サイズ変更アルゴリズム

WindowsFormsHost 要素では、次の手順を使用して、ホストされているコントロールのサイズを変更します。

  1. WindowsFormsHost 要素によって、MeasureOverride および ArrangeOverride メソッドがオーバーライドされます。

  2. ホストされているコントロールのサイズを決定するために、MeasureOverride メソッドから、MeasureOverride メソッドに渡された制約から変換された制約を使用して、ホストされているコントロールの GetPreferredSize メソッドが呼び出されます。

  3. ArrangeOverride メソッドを使用すると、ホストされているコントロールの指定されたサイズ制約への設定が試行されます。

  4. ホストされているコントロールの Size プロパティが指定された制約と一致する場合、ホストされているコントロールは制約に合わせてサイズが変更されます。

Size プロパティが指定された制約と一致しない場合、ホストされているコントロールは連続サイズ変更をサポートしません。 たとえば、MonthCalendar コントロールでは個別のサイズのみが許可されています。 このコントロールに許可されるサイズは、高さと幅の両方の整数 (月数を表します) で構成されます。 このような場合、WindowsFormsHost 要素は次のように動作します。

  • Size プロパティから、指定された制約よりも大きいサイズが返される場合、ホストされているコントロールは WindowsFormsHost 要素によってクリップされます。 高さと幅は個別に処理されるので、どちらの方向でもホストされているコントロールがクリップされる可能性があります。

  • Size プロパティから、指定した制約よりも小さいサイズが返されると、このサイズ値は、WindowsFormsHost によって受け入れられ、この値が WPF レイアウト システムに返されます。

関連項目