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

更新 : 2007 年 11 月

ここでは、WindowsFormsHost 要素と WPF レイアウト システムの対話方法を説明します。

WPF および Windows フォームは、フォームまたはページでの要素のサイズ設定や配置について、違いはあっても似ているロジックをサポートします。WPF で Windows フォームコントロールをホストするハイブリッド ユーザー インターフェイス (UI) を作成する場合、WindowsFormsHost 要素により 2 つのレイアウト スキームが統合されます。

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

WPF は、解像度に依存しないレイアウトを使用します。すべての WPF レイアウトのサイズは、デバイス非依存ピクセルを使用して指定されます。デバイス非依存ピクセルのサイズは 1/96 インチで、解像度に依存しないため、出力先が 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 フォームのサイズに関連する操作を実行する場合には、常に 2 つの座標系が関連します。この 2 つの座標系は、WPF についてはデバイス非依存ピクセル、Windows フォームについてはハードウェア ピクセルです。したがって、一貫性のあるレイアウトを実現するためには、正しい単位変換とスケーリング変換を適用する必要があります。

座標系間の変換は、現在のデバイスの解像度、および 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 に伝達されて、レイアウトの更新をトリガします。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 レイアウト システムに返します。

参照

処理手順

チュートリアル : Windows Presentation Foundation での Windows フォーム コントロールの配置

Windows Presentation Foundation での Windows フォーム コントロールの配置のサンプル

概念

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

参照

ElementHost

WindowsFormsHost

その他の技術情報

移行と相互運用性