2012-01-20 6 views
2

WPFでカスタムユーザーコントロールを作成しようとしています。私は後で他のウィンドウ内でコントロールを使用するときに、手動でサイズを設定できるようにしたい。InitializeComponent()のカスタムコントロールのサイズ

簡単なテストとして、グリッド内にキャンバスを含むコントロールを作成しました。このキャンバスはコントロールを完全に塗りつぶします。初期化されると、そのサイズを示す矩形を描画します。私はそれを窓に置いて、私が望むどんな大きさでも作る。私は、この値を初期化制御がまだ0である、と私は何を取得するとき、私はその後、

this.ActualHeight 

を描く矩形の高さを作るかのように、私は今、問題を抱えているが

。代わりに私が

this.Height 

を使用する場合、私は私が設計時にそれを作った高さを取得し、サイズではなく、私はその後、ウィンドウ内にそれを作りました。

XAMLデザイナ内で高さと幅が設定されているようですので、何をすべきか分かりません。

簡単な方法はありますか?

答えて

1

私はあなたが経験していることは、どのようにWPF performs layoutと思い、キャンバスがレイアウトにどのように参加しないのかと思います。

特定のケースでは、矩形の幅をCanvas.ActualWidthに設定していますか?キャンバスの幅/高さが明示的に設定されていないかぎり、ActualWidth/Actualheightはゼロになるため、キャンバスの子を配置する参照ポイントを取得することはできません。私は、キャンバスの幅と高さを親コンテナにバインドする(またはコードで設定する)ことで、ActualWidth/ActualHeightが正しく伝播されるようにします。

この例では、WPFレイアウトエンジンの仕組みを理解しています。次のコードでは、FrameworkElementの高さを強制的に幅、高さを通常通りに設定し、問題の要素に対してレイアウト(測定、配置の調整)を強制します。これにより、WPFレイアウトエンジンは要素を測定/配置し、幅、高さをActualWidth、ActualHeightに伝播します。例えば

// Set the width, height you want 
element.Width = 123; 
element.Height = 456; 

// Force measure/arrange 
element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
element.Arrange(new Rect(0, 0, element.DesiredWidth, element.DesiredHeight)); 

// Subject to sufficient space, the actual width, height will have 
// the values propagated from width/height after a measure and arrange call 
double width = element.ActualWidth; 
double height = element.ActualHeight; 

また明確にするためthis related questionを参照してください。私は上記の方法を時々、キャンバス上に正しく配置するためにテキストブロック内のテキストを測定するために使用しました。

+1

もう一度おねがいします。私はまた、画面のサイズ変更のためにどうしても発生する必要がある、私のコントロールのSizeChanged()イベントの後に再描画を開始することによって、別の方法で偶然を見つけました。 – Greg