繁体   English   中英

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

[英]WP8/XAML - Measure string length in pixels

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

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线程联系,这很糟糕。 这已经是非常丑陋的代码,任何进一步的膨胀都会让我呕吐,一想到使用它。

Graphics.MeasureString()在WP平台上不可用。

那么...有什么人道主义的方式吗? 解决方案不需要与WP7向后兼容,它甚至可能是C ++代码,因为它是我需要文本长度的运行时组件中的代码,因此ti甚至可以消除一些本机管理的本机计算时间跳跃。

还是最后我做错了方法?

我在WriteableBitmap上呈现了TextBlock,它需要采用仍可容纳整个文本的最小尺寸。 即使使用已知的最大位图大小(屏幕分辨率或父级大小),在最坏的情况下,对于一张位图,它仍将占用1MB至7MB的内存,具体取决于设备屏幕。 预计同时使用约30篇文章,这将是谋杀案。 因此,这种方法最终更加丑陋。

(目前渲染的可怜图像在XAML应用程序中与WriteableBitmaps结合在一起,并在运行时组件中放置了逻辑,最后,我计划将渲染模块替换为DirectX,但目前它需要以可接受的速度工作,并专注于其中的重要部分,应用逻辑,因为第一个版本的截止日期即将结束)

在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()),它都可以充当代理。

有关ActualWidth的MSDN

尝试这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM