2011-07-21 10 views
2

私はこのようなキャンバス上のテキストボックスを作成します。作成時にTextBlockの幅を知ることはできますか?

 TextBlock t = new TextBlock(); 
     t.Foreground = new SolidColorBrush(...); 
     t.FontSize = 10; 
     t.HorizontalAlignment = HorizontalAlignment.Left; 
     t.VerticalAlignment = VerticalAlignment.Top; 
     t.Text = ...; 

     Canvas.SetLeft(t, "f(width)"); 
     Canvas.SetTop(t, ...);     

     canvas.Children.Add(t); 

左座標ので、私は、このテキストブロックの幅を知りたいが、この依存します。 できますか? ActualWidthは0です。 ありがとうございます。

+0

WPFに「幅」がないと思っていました。マージン/パディングを使用して、コンテナにどのように収まるかを判断する必要があります。左の座標はそれに依存していますか?あなたは何をしようとしているのですか? – musefan

+0

@musefan幅と高さのプロパティだけでなく、ActuallWidthとActualHeight – Berial

答えて

3

追加する前に、Measure onを呼び出してからDesiredSizeを使用してください。

編集:キャンバスは一度置かれた要素のサイズに影響しないので、これは問題ありません。たとえば、固定サイズの行を持つGridに追加した場合、Gridへの追加によって変更されるため、一度追加された実際のHeightは表示されません。

Mario Vernariが指摘するように、実際の複雑な配置が必要な場合は、ArrangeOverride(および場合によってはMeasureOverride)をオーバーライドしてカスタムパネルを作成するのはかなり簡単です。 CanvasはStackPanelなどのように実際にこのように記述されています。これらはすべて固有の測定および配置パネルであり、独自に作成することもできます。

+0

私のここでの投票。しかし、要素がビジュアルツリーにアタッチされる前にMeasureを呼び出すのは良い方法ではありません。 –

+0

@Mario、場合によっては真ですが、キャンバスに追加するとビジュアルツリーはサイズに影響を与えません。+無限大のサイズ+無限大をMeasureに安全に渡すことができます。 –

+0

私は知っています。あなたのコントロールにも子供がいないときに行うことができますが、私はこの練習を控えるでしょう。代わりに、私はCanvas(またはPanel)から独自のコントロールを派生させ、私のカスタムポジショニングシステムを書く方が好きです。もっとエレガントな... –

関連する問題