我做类似的调整个别文本框的字体大小的东西(以确保它们都适合)。基本上,我在代码中创建一个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的这个网站上有一些例子,在特定长度之后在单词边界上突破。
另一个选择是为每个可能的字体大小提前计算页面大小(并用switch语句对它进行硬编码)。如果您允许任何字体和任何大小的组合,这很容易让人抓狂,如果您允许混合字体/大小,将会很糟糕,但性能会非常好。很可能你有一个特定的可读大小范围,只有几个字体。创建一个测试应用程序来计算这些组合的每个页面的文本长度不会那么硬,很可能会令您的生活更轻松 - 即使它没有“感觉”的权利,作为一个程序员:)
我会试试看,以前没有单纯从代码中尝试。 – 2011-04-07 11:19:20
注释为答案,因为这是我的问题的最佳答案。可能不是我通过的路线。 – 2011-04-07 11:19:47