Lia*_*son 5 silverlight textblock measure windows-phone-7
我目前正在为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));
}
Run Code Online (Sandbox Code Playgroud)
以上是未经测试的代码,但希望可以帮助您入门。基本上它会检查文本是否可以放入框中,如果可以,就可以开始了。如果不适合,它会找出可以容纳的文本百分比并返回它。这不考虑单词中断,并且可能不是完美的匹配,但应该可以让您接近。
您可以更改此代码以返回长度而不是实际的子字符串,并将其用作页面大小。在代码中创建文本块(不显示)实际上表现得很好(我在一些表视图中执行此操作,没有明显的滞后)。我不会将所有 120,000 个单词发送到此函数,而是发送某种合理的子集。
一旦获得理想的长度,您就可以使用正则表达式将书分成几页。正则表达式网站上有一些示例,这些示例在特定长度后会打破单词边界。
另一种选择是提前计算每个潜在字体大小的页面大小(并使用 switch 语句对其进行硬编码)。如果您允许任何字体和任何大小组合,这很容易变得疯狂,如果您允许混合字体/大小,则会很糟糕,但会表现得很好。您很可能有特定的可读尺寸范围,并且只有几种字体。创建一个测试应用程序来计算每个组合的页面文本长度不会那么困难,并且可能会让您的生活更轻松 - 即使作为程序员“感觉”不正确:)
| 归档时间: |
|
| 查看次数: |
3920 次 |
| 最近记录: |