Windows应用商店应用:测量TextBlock宽度将是多少像素?

时间:2015-04-16 17:32:22

标签: xaml windows-store-apps

有没有办法测量TextBlock宽度占用的多个像素? 让我们说我有一个长度为10个字符的字符串。

我有一个文本块(没有指定的宽度值),我将字符串设置为该文本块的Text属性。

在将文本块添加到布局之前,有没有办法测量文本块的实际宽度?

2 个答案:

答案 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;
        }