個々のテキストボックスのフォントサイズを調整するのと同じようなことをします(すべてが収まるようにするため)。基本的に、コードで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語すべてを送信するわけではありませんが、ある種の妥当なサブセットを送信します。
理想的な長さになったら、正規表現を使用して本をページに分割できます。正規表現のこのサイトには、特定の長さの後に単語の境界を破る例があります。
もう1つのオプションは、潜在的なフォントサイズごとに事前にページサイズを計算することです(そしてswitchステートメントでハードコーディングします)。これは、任意のフォントと任意のサイズの組み合わせを許可している場合は簡単に気が狂う可能性があり、混合フォント/サイズを許可している場合はひどいものになりますが、非常にうまく機能します。ほとんどの場合、読み取り可能なサイズの特定の範囲と、ほんの数個のフォントがあります。これらの組み合わせごとにページのテキストの長さを計算するテストアプリを作成することはそれほど難しくなく、プログラマーとして正しく「感じ」なくても、おそらくあなたの生活を楽にするでしょう:)