[英]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()),它都可以充當代理。
嘗試這個:
t.Measure( new Size( 1000, 1000 );
t.Arrange( new Rect( 0, 0, 1000, 1000 );
t.UpdateLayout();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.