微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

silverlight – 以编程方式确定文本框中的最大适合度(WP7)

我目前正在为Windows Phone Seven编写电子书阅读器,我正试图像Kindle阅读器那样设计它.为了做到这一点,我需要将我的书分成页面,当添加可变字体大小时,这将变得更加复杂.

为了做到这一点,我只是一次在文本块中添加一个单词,直到它变得高于它的容器.但是你可以想象,如果有一个超过120,000字的文件,这将花费一段不可接受的时间.

有没有一种方法可以找出文本何时超出界限(逻辑上将其划分为页面),而不必实际呈现它?这样我就可以在后台线程中运行它,这样用户可以在此期间继续阅读.

到目前为止,我发现的唯一想法是找出文本块如何决定其边界(在度量调用中?),但我不知道如何找到该代码,因为反射器没有显示任何内容.

提前致谢!

解决方法

我做了类似的事情来调整单个文本框的字体大小(以确保它们都适合).基本上,我在代码中创建一个TextBlock,设置我的所有属性并检查ActualWidth和ActualHeight属性.这里有一些伪代码可以帮助解决您的问题:

public static String PageText(TextBlock txtPage,String BookText)
{
    TextBlock t = new TextBlock();
    t.FontFamily = txtPage.FontFamily;
    t.FontStyle = txtPage.FontStyle;
    t.FontWeight = txtPage.FontWeight;
    t.FontSize = txtPage.FontSize;
    t.Text = BookText;

    Size Actual = new Size();
    Actual.Width = t.ActualWidth;
    Actual.Height = t.ActualHeight;

    if(Actual.Height <= txtPage.ActualHeight)
        return BookText;

    Double hRatio = txtPage.ActualHeight / Actual.Height;
    return s.Substring((int)((s.Length - 1) * hRatio));
}

以上是未经测试的代码,但希望可以帮助您入门.基本上它会看到文本是否可以放在框中,如果是这样你就可以去了.如果没有,它会找出文本的百分比,并将其返回.这不会考虑单词,也可能不是一个完美的匹配,但应该让你接近.

您可以更改此代码以返回长度而不是实际的子字符串,并将其用作页面大小.在代码中创建文本块(没有显示)实际上表现非常好(我在一些表视图中执行它没有明显的延迟).我不会将所有120,000个单词发送到此函数,而是某种合理的子集.

一旦达到理想长度,就可以使用RegEx将书籍分成页面. RegEx的这个站点上有一些示例,它们在特定长度后打破字边界.

另一种选择是提前计算每个潜在字体大小的页面大小(并使用switch语句对其进行硬编码).如果你允许任何字体和任何大小的组合,这可能很容易变得疯狂,如果你允许混合字体/大小,但是表现很好会很糟糕.很可能你有一个特定范围的可读大小,只有几种字体.创建一个测试应用程序来计算每个组合的页面文本长度并不会那么难,并且可能会让你的生活更轻松 – 即使它不像程序员那样“感觉”正确:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐