簡體   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