Я делаю что-то подобное, чтобы настроить размер шрифта для отдельных текстовых полей (чтобы убедиться, что они все подходят). По сути, я создаю 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). Это может легко сойти с ума, если вы разрешаете любой шрифт и любую комбинацию размеров, и было бы ужасно, если бы вы разрешали смешанные шрифты/размеры, но работало бы очень хорошо. Скорее всего, у вас есть определенный диапазон читаемых размеров и всего несколько шрифтов. Создать тестовое приложение для расчета длины текста на странице для каждой из этих комбинаций было бы не так сложно и, вероятно, облегчило бы вашу жизнь, даже если программисту это не кажется правильным :)
person
theChrisKent
schedule
01.03.2011