【问题标题】:How can I measure the Text Size in UWP Apps?如何测量 UWP 应用中的文本大小?
【发布时间】:2016-06-28 09:36:33
【问题描述】:

在 WPF 中,这可以使用 FormattedText,如下所示:

private Size MeasureString(string candidate)
{
    var formattedText = new FormattedText(
        candidate,
        CultureInfo.CurrentUICulture,
        FlowDirection.LeftToRight,
        new Typeface(this.textBlock.FontFamily, this.textBlock.FontStyle, this.textBlock.FontWeight, this.textBlock.FontStretch),
        this.textBlock.FontSize,
        Brushes.Black);

    return new Size(formattedText.Width, formattedText.Height);
}

但是在 UWP 中这个类已经不存在了。那么在通用windows平台中如何计算文本尺寸呢?

【问题讨论】:

    标签: c# uwp win-universal-app


    【解决方案1】:

    在 UWP 中,您创建一个TextBlock,设置其属性(如TextFontSize),然后调用其Measure 方法并传入无限大小。

    var tb = new TextBlock { Text = "Text", FontSize = 10 };
    tb.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
    

    之后,它的DesiredSize 属性包含 TextBlock 的大小。

    【讨论】:

    • @Reddy 我没那么快(尽管我希望我是)。提问时有一个“回答你自己的问题”复选框。我这样做是因为我没有在 SO 上找到任何关于这个问题的问题或答案,所以其他人会找到它(希望如此)并且不必搜索时间。
    • 请注意,这并不特定于 UWP。它也可以在 WPF 或 Silverlight 中工作。
    • @MarcelW 不确定你的意思。这对我很有效,在 WPF 中也是如此。
    • 这运行起来很慢,必须在 UI 线程上运行。谁能找到可以在后台线程上运行的替代方案?
    • @Paymon:也许this answer可以帮助你。
    【解决方案2】:

    这是使用 Win2D 的另一种方法:

    private Size MeasureTextSize(string text, CanvasTextFormat textFormat, float limitedToWidth = 0.0f, float limitedToHeight = 0.0f)
    {
        var device = CanvasDevice.GetSharedDevice();
    
        var layout = new CanvasTextLayout(device, text, textFormat, limitedToWidth, limitedToHeight);
    
        var width = layout.DrawBounds.Width;
        var height = layout.DrawBounds.Height;
    
        return new Size(width, height);
    }
    

    你可以这样使用它:

    string text = "Lorem ipsum dolor sit amet";
    
    CanvasTextFormat textFormat = new CanvasTextFormat
    {
        FontSize = 16,
        WordWrapping = CanvasWordWrapping.WholeWord,
    };
    
    Size textSize = this.MeasureTextSize(text, textFormat, 320.0f);
    

    Source

    【讨论】:

    • 这太棒了!不幸的是,在某些情况下它给出了我奇怪的结果:在这里查看我的问题stackoverflow.com/questions/55801411/…
    • @CristianoGhersi:如果是文本意图问题,如果您使用固定值作为解决方法怎么办?否则我认为你必须使用另一种解决方案......
    • 一个固定值可以很好地工作,你能在这个想法上多扩展一点吗?例如您打算将固定值放在哪里?
    • 直观地说,我会在GetRichTextHeight() 中说,在返回finalH 之前,您会考虑缩进。
    • 使用layout.LayoutBounds 而不是layout.DrawBoundsLayoutBounds 会给你预期的结果。
    【解决方案3】:

    如果您在 UWP 中遇到 Size 无法解决或无法正常使用双精度的问题。可能是因为您使用的是System.Drawing.Size

    请改用Windows.Foundation.Size

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 2021-04-27
      相关资源
      最近更新 更多