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

C# WP8/XAML-以像素为单位测量字符串长度,c#,string,xaml,windows-phone-8,measure,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线

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

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替换渲染模块,但现在它需要以某种可接受的速度工作,并专注于应用程序逻辑中的重要部分,因为第一个版本的截止日期即将到来)试试这个:

t.Measure( new Size( 1000, 1000 );
t.Arrange( new Rect( 0, 0, 1000, 1000 );
t.UpdateLayout();
试试这个:

t.Measure( new Size( 1000, 1000 );
t.Arrange( new Rect( 0, 0, 1000, 1000 );
t.UpdateLayout();
试试这个:

t.Measure( new Size( 1000, 1000 );
t.Arrange( new Rect( 0, 0, 1000, 1000 );
t.UpdateLayout();
试试这个:

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

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

根据我找到的所有信息,在测量和排列控件之前,不应设置ActualWidth,但在DesiredSize为测量和排列的控件(即使是静态添加到窗体中的控件)返回0时,它会以某种方式工作。这与可用材料中的描述不同

这个解决方案仍然相当难看,如果我理解正确,如果设备dpi不是96,则无法给出正确的数字,因为实际宽度/高度值为1/96的“设备独立单位”。但现在,若我并没有弄错的话,所有WP8设备都是以旧的96dpi工作的,所以在找到或提供真正的解决方案之前(如desktop.NET Graphics.MeasureString()),它可以充当代理


.

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

根据我找到的所有信息,在测量和排列控件之前,不应设置ActualWidth,但在DesiredSize为测量和排列的控件(即使是静态添加到窗体中的控件)返回0时,它会以某种方式工作。这与可用材料中的描述不同

这个解决方案仍然相当难看,如果我理解正确,如果设备dpi不是96,则无法给出正确的数字,因为实际宽度/高度值为1/96的“设备独立单位”。但现在,若我并没有弄错的话,所有WP8设备都是以旧的96dpi工作的,所以在找到或提供真正的解决方案之前(如desktop.NET Graphics.MeasureString()),它可以充当代理


.

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

根据我找到的所有信息,在测量和排列控件之前,不应设置ActualWidth,但在DesiredSize为测量和排列的控件(即使是静态添加到窗体中的控件)返回0时,它会以某种方式工作。这与可用材料中的描述不同

这个解决方案仍然相当难看,如果我理解正确,如果设备dpi不是96,则无法给出正确的数字,因为实际宽度/高度值为1/96的“设备独立单位”。但现在,若我并没有弄错的话,所有WP8设备都是以旧的96dpi工作的,所以在找到或提供真正的解决方案之前(如desktop.NET Graphics.MeasureString()),它可以充当代理


.

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

根据我找到的所有信息,在测量和排列控件之前,不应设置ActualWidth,但在DesiredSize为测量和排列的控件(即使是静态添加到窗体中的控件)返回0时,它会以某种方式工作。这与可用材料中的描述不同

这个解决方案仍然相当难看,如果我理解正确,如果设备dpi不是96,则无法给出正确的数字,因为实际宽度/高度值为1/96的“设备独立单位”。但现在,若我并没有弄错的话,所有WP8设备都是以旧的96dpi工作的,所以在找到或提供真正的解决方案之前(如desktop.NET Graphics.MeasureString()),它可以充当代理


.

谢谢,但它没有效果,正如我所穿的答案中所述。谢谢,但它没有效果,正如我所穿的答案中所述。谢谢,但它没有效果,正如我所穿的答案中所述。谢谢,但它没有效果,正如我所穿的答案中所述。