Я делаю что-то похожее, чтобы настроить размер шрифта для отдельных текстовых полей (чтобы они все подходили). По сути, я создаю 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));
}
Вышеприведенный код не проверен, но, надеюсь, поможет вам начать. По сути, он видит, может ли текст уместиться в поле, и если да, то все готово. Если нет, он выясняет, какой процент текста может поместиться и возвращает его. Это не учитывает разрывы слов и не может быть идеальным соответствием, но должно вас сблизить.
Вы можете изменить этот код так, чтобы он возвращал длину, а не фактическую подстроку, и использовать ее в качестве размера страницы. Создание текстового блока в коде (без отображения) на самом деле работает довольно хорошо (я делаю это в некоторых табличных представлениях без заметной задержки). Я не стал бы посылать все 120000 слов в эту функцию, но это было бы разумное подмножество.
Получив идеальную длину, вы можете использовать RegEx, чтобы разбить книгу на страницы. На этом сайте RegEx есть примеры, которые выходят за границы слов после определенной длины.
Другой вариант - заранее рассчитать размер страницы для каждого потенциального размера шрифта (и жестко закодировать его с помощью оператора switch). Это может легко сойти с ума, если вы разрешите любой шрифт и любые комбинации размеров, и будет ужасно, если вы разрешите смешанные шрифты / размеры, но будет работать очень хорошо. Скорее всего, у вас есть определенный диапазон читаемых размеров и всего несколько шрифтов. Создание тестового приложения для расчета длины текста страницы для каждой из этих комбинаций не будет таким сложным и, вероятно, облегчит вашу жизнь - даже если оно «не чувствует себя» как программист:)