2つのTextBlockコントロール(スタック)とその下にある他の要素を含むWPFDataTemplateがあります。レイアウトコードが複雑なため、2つのTextBlock要素の高さを知って、派手なコネクタラインを描画したり、他のコントロールを並べたりできるようにする必要があります。
TextBlocksに入るテキストを知っていて、フォントなどを知っている場合、実際にレンダリングせずにこれらのTextBlocksの高さを計算または測定できる方法はありますか?
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は、DesiredSize()結果の制限として機能しているようです。たとえば、msrSize = new Size(10、10)を使用すると、ここではdsrdSizeが{10,10}になります。これが誰かを助けることを願っています。
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);
}
また、MeasureはUIElementで定義されているため、TextBlockを含む任意のUIElement派生オブジェクトの形状を測定できます。
public static Size ShapeMeasure(UIElement e) {
// Measured Size is bounded to be less than maxSize
Size maxSize = new Size(
double.PositiveInfinity,
double.PositiveInfinity);
e.Measure(maxSize);
return e.DesiredSize;
}