WP8 / XAML - 测量字符串长度(以像素为单位)

时间:2013-12-30 22:45:48

标签: c# string xaml windows-phone-8 measure

像素长度测量代码,如下所示:

public int TextWidth(string text)
    {
        TextBlock t = new TextBlock();
        t.Text = text;
        t.Measure(new Size(1000, 1000));
        return (int)t.DesiredSize.Width;
    }

不工作(结果为0)因为它需要显示TextBlock(不需要可见性),所以需要联系gui线程,这很糟糕。 它已经是非常难看的代码了,任何进一步的膨胀都会让我呕吐,只想到使用它。

在WP平台上没有Graphics.MeasureString()。

所以...有什么人道主义方式可以做到吗? 解决方案不需要向后兼容WP7,它甚至可能是C ++代码,因为它在运行时组件中我需要文本长度,所以ti甚至可以削减一些本机托管本机计算时间吞噬跳跃。

或者最后我做错了方法?

我在WriteableBitmap上渲染了TextBlock,这需要采用仍然适合整个文本的最小尺寸。 即使已知位图可以采用的最大尺寸(屏幕分辨率或父级大小),在最坏的情况下,根据设备屏幕,它仍会占用1MB到7MB的内存。与预测的同时使用的约30个文本将是记忆谋杀。 所以这种方法最终会更加丑陋。

(渲染目前很可怜Image在XAML应用程序中使用WriteableBitmaps,其中逻辑放在运行时组件中,最后我计划用DirectX替换渲染模块,但是现在它需要以一些可接受的速度工作并专注于重要部分,app逻辑,因为第一个版本的截止日期正在关闭)

2 个答案:

答案 0 :(得分:3)

在WP8设备上运行的解决方案(在HTC 8S和Lumia 920上测试)

    public int TextWidth(string text)
    {
        TextBlock t = new TextBlock();
        t.Text = text;
        //Height and Width are depending on font settings
        //t.FontFaimily=...
        //t.FontSize=...
        //etc.
        return (int)Math.Ceiling(t.ActualWidth);
    }

根据我发现的所有信息,在测量和排列控制之前不应设置ActualWidth,但是在DesiredSize为测量和排列的控件返回0时,不管怎么说它都有效,甚至是静态添加到窗体中的控件。这与可用材料中描述的不同。

这个解决方案仍然相当难看,如果我理解正确的话,如果设备dpi不是96,那么将无法给出正确的数字,因为ActualWidht / Height值是1/96的“设备无关单位”。但就目前而言,如果我没有弄错的话,所有的WP8设备都可以使用旧的96dpi工作,所以在找到真正的解决方案或者提供真正的解决方案之前(如桌面.NET Graphics.MeasureString())它可以作为代理。

MSDN about ActualWidth

答案 1 :(得分:0)

试试这个:

t.Measure( new Size( 1000, 1000 );
t.Arrange( new Rect( 0, 0, 1000, 1000 );
t.UpdateLayout();