WPFがレンダリングされる前に、WPFのテキストブロックのサイズを測定するにはどうすればよいですか?
質問
2つのテキストブロックコントロール(積み重ねられた)を備えたWPF DateTemplateがあり、その後いくつかの他の要素があります。複雑なレイアウトコードのため、2つのテキストブロック要素の高さを知る必要があります。これにより、派手なコネクタラインを描き、他のコントロールなどを並べることができます。
テキストブロックに入っているテキストを知っていて、フォントなどを知っている場合、実際にレンダリングせずにこれらのテキストブロックの高さを計算または測定できる方法はありますか?
解決
電話するだけで十分だと思います UIElement.Measure(Size)
メソッドとその後、を確認します UIElement.DesiredSize
財産。詳細については、提供されたMSDNリンクを確認してください。
他のヒント
通話 UIElement.Measure(Size)
, 、パラメーターとして取得します Size
. 。 2回目の呼び出し UIElement.DesiredSize
何でも返します Size
あなたはに渡りました Measure
方法。
私はこれが事実だと思います UIElement
(TextBlock
この場合、)は(まだ)コントロールの子供ではないため、 DesiredSize
何も違う理由はありません。
これはかなり古い質問であることを感謝していますが、次のコードを使用していることがわかりました
TextBlock textBlock = new TextBlock();
textBlock.Text = "NR valve";
Size msrSize = new Size(100, 200);
textBlock.Measure(msrSize);
Size dsrdSize = textBlock.DesiredSize;
dsrdsizeは{47.05,15.96}として返されます。トリックは、MSRSizeを予想される実際のサイズよりも大きくするようです。 msrsizeは、希望の結果の制限として機能するようです。たとえば、msrsize = new Size(10、10)を使用すると、ここで{10,10}のdsrdsizeが生成されます。これが誰かを助けることを願っています。
public static Size ShapeMeasure(TextBlock tb) {
// Measured Size is bounded to be less than maxSize
Size maxSize = new Size(
double.PositiveInfinity,
double.PositiveInfinity);
tb.Measure(maxSize);
return tb.DesiredSize;
}
public static Testit()
{
TextBlock textBlock = new TextBlock();
textBlock.Text = "NR valve";
Size text size = ShapeMeasure(textBlock);
}