有没有办法测量TextBlock宽度占用的多个像素? 让我们说我有一个长度为10个字符的字符串。
我有一个文本块(没有指定的宽度值),我将字符串设置为该文本块的Text属性。
在将文本块添加到布局之前,有没有办法测量文本块的实际宽度?
答案 0 :(得分:0)
在将任何控件添加到VisualTree之前,它的宽度和高度为零。 你有两个选择,第一个是:
var newTextBlock = new TextBlock() { Opacity = 0.001, Text = "Test" };
RoutedEventHandler handler = null;
handler = (s, e) =>
{
newTextBlock.Loaded -= handler;
Panel.Children.Remove(newTextBlock);
};
newTextBlock.Loaded += handler;
Panel.Children.Add(newTextBlock);
在处理程序中进行所需的所有操作,因为现在你有了ActualWidth和ActualHeight。
另一个是使用Win2D,您可以执行以下操作:
var test = new CanvasTextFormat() { WordWrapping = CanvasWordWrapping.WholeWord };
session.DrawText(largeloremipsum, new Rect(0, 0, 480, 0), Colors.Black, test);
var size = new CanvasTextLayout(canvasControl, text, test, 480, float.MaxValue);
但这是一种更复杂的方式,你可以为Size,Font等定义TextFormat。
答案 1 :(得分:0)
好吧,我得到的唯一方法是创建一个新的-in内存文本块 - 然后为它分配与我的目标TextBlock相同的文本,样式和属性,我假设我的文本块有一个固定的高度,来计算它适合文本所需的宽度,我做了以下功能:
private double CalculateDesiredWidth(string text, TextBlock targetText)
{
int MIN_TEXT_WIDTH=200;
//create a new text block to calculate how much space will the string occupy
TextBlock txt = new TextBlock();
txt.Text = text;
txt.FontSize = 16;
txt.Margin = targetText.Margin;
Size desiredSize = new Size(0, targetText.ActualHeight);
Rect desiredRect = new Rect(new Point(0, 0), desiredSize);
//measure the desired size
txt.Measure(desiredSize);
txt.Arrange(desiredRect);
//if the desired width is small, use the minimum default width
if (txt.ActualWidth <= MIN_TEXT_WIDTH)
return MIN_TEXT_WIDTH;
//calculate the desired area
double desiredArea = txt.ActualWidth * txt.ActualHeight;
//calculate the the width required to fit the desired area to my text box
double width = desiredArea / (targetText.Height - txt.Margin.Top - txt.Margin.Bottom);
return width;
}