像素长度测量代码,如下所示:
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逻辑,因为第一个版本的截止日期正在关闭)
答案 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())它可以作为代理。
答案 1 :(得分:0)
试试这个:
t.Measure( new Size( 1000, 1000 );
t.Arrange( new Rect( 0, 0, 1000, 1000 );
t.UpdateLayout();