WindowsFormsHost 要素のレイアウトに関する考慮事項
このトピックでは、WindowsFormsHost 要素が WPF レイアウト システムと対話する方法について説明します。
WPF フォームと Windows フォームでは、フォームまたはページ上の要素のサイズ設定と配置を行うさまざまなロジックがサポートされていますが、似ています。 WPF で Windows フォーム コントロールをホストするハイブリッド ユーザー インターフェイス (UI) を作成すると、WindowsFormsHost 要素によって 2 つのレイアウト スキームが統合されます。
WPF フォームと Windows フォーム間のレイアウトの違い
WPF では、解像度に依存しないレイアウトが使用されます。 すべての WPF レイアウト ディメンションは、デバイスに依存しないピクセル
WPF は、動的レイアウト
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 要素は特定のコントロールでサポートされている程度にスケーリングされます。
ScaleChild メソッドをオーバーライドして、ホストされている Windows フォーム コントロールのカスタム スケーリング動作を提供します。
スケーリングに加えて、次の表に示すように、WindowsFormsHost 要素は丸めとオーバーフローのケースを処理します。
変換の問題 | 説明 |
---|---|
丸め | WPF デバイスに依存しないピクセルディメンションは double として指定され、Windows フォームハードウェアピクセル寸法は int として指定されます。 double ベースのディメンションが int ベースのディメンションに変換される場合、WindowsFormsHost 要素は標準の丸めを使用するため、0.5 未満の小数部の値は 0 に切り捨てられます。 |
オーバーフロー | WindowsFormsHost 要素が double 値から int 値に変換すると、オーバーフローが発生する可能性があります。 MaxValue より大きい値は、MaxValueに設定されます。 |
レイアウト関連のプロパティ
Windows フォーム コントロールと WPF 要素のレイアウト動作を制御するプロパティは、WindowsFormsHost 要素によって適切にマップされます。 詳細については、「Windows フォームと WPF プロパティ マッピングの」を参照してください。
ホストされたコントロールのレイアウトの変更
ホストされている Windows フォーム コントロールのレイアウト変更が WPF に反映され、レイアウトの更新がトリガーされます。 WindowsFormsHost の InvalidateMeasure メソッドを使用すると、ホストされたコントロールのレイアウト変更によって WPF レイアウト エンジンが実行されるようになります。
Windows フォーム コントロールのサイズを継続的に調整する
継続的スケーリングをサポートする Windows フォーム コントロールは、WPF レイアウト システムと完全に対話します。 WindowsFormsHost 要素は、ホストされている Windows フォーム コントロールのサイズ設定と配置に、通常どおり MeasureOverride メソッドと ArrangeOverride メソッドを使用します。
サイズ変更アルゴリズム
WindowsFormsHost 要素では、次の手順を使用して、ホストされるコントロールのサイズを設定します。
WindowsFormsHost 要素は、MeasureOverride メソッドと ArrangeOverride メソッドをオーバーライドします。
ホストされるコントロールのサイズを決定するために、MeasureOverride メソッドは、MeasureOverride メソッドに渡された制約から変換された制約を使用して、ホストされたコントロールの GetPreferredSize メソッドを呼び出します。
ArrangeOverride メソッドは、ホストされているコントロールを指定されたサイズ制約に設定しようとします。
ホストされたコントロールの Size プロパティが指定した制約と一致する場合、ホストされるコントロールのサイズは制約に合わせて調整されます。
Size プロパティが指定した制約と一致しない場合、ホストされたコントロールは継続的なサイズ変更をサポートしません。 たとえば、MonthCalendar コントロールでは、個別のサイズのみを使用できます。 このコントロールに許可されるサイズは、高さと幅の両方の整数 (月数を表す) で構成されます。 このような場合、WindowsFormsHost 要素は次のように動作します。
Size プロパティが指定した制約よりも大きいサイズを返す場合、WindowsFormsHost 要素はホストされたコントロールをクリップします。 高さと幅は個別に処理されるため、ホストされたコントロールはどちらの方向にもクリップできます。
Size プロパティが指定した制約よりも小さいサイズを返す場合、WindowsFormsHost はこのサイズ値を受け取り、その値を WPF レイアウト システムに返します。
関連項目
- ElementHost
- WindowsFormsHost
- チュートリアル: WPF での Windows フォーム コントロールの配置
- WPF サンプルにおける Windows フォーム コントロールの配置
- Windows フォームと WPF プロパティ マッピング
- 移行と相互運用性の
.NET Desktop feedback