Используя WPF, каков наиболее эффективный способ измерения большого количества коротких строк? В частности, я хотел бы определить высоту отображения каждой строки, учитывая единообразное форматирование (тот же шрифт, размер, вес и т.д.) И максимальную ширину строки может занимать?
Измерение текста в WPF
Ответ 1
Самый низкоуровневый метод (и, следовательно, предоставляющий наибольшую возможность для творческих оптимизаций) заключается в использовании GlyphRuns.
Это не очень хорошо документировано, но я написал здесь небольшой пример:
http://smellegantcode.wordpress.com/2008/07/03/glyphrun-and-so-forth/
В примере используется длина строки как необходимый шаг перед ее рендерингом.
Ответ 2
Это очень просто и сделано классом FormattedText! Попробуйте.
Ответ 3
В WPF:
Не забудьте вызвать Measure() на TextBlock перед чтением свойства DesiredSize.
Если TextBlock был создан "на лету" и еще не показан, вы должны сначала вызвать Measure():
MyTextBlock.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
return new Size(MyTextBlock.DesiredSize.Width, MyTextBlock.DesiredSize.Height);
В Silverlight:
Нет необходимости измерять.
return new Size(TextBlock.ActualWidth, TextBlock.ActualHeight);
Полный код выглядит следующим образом:
public Size MeasureString(string s) {
if (string.IsNullOrEmpty(s)) {
return new Size(0, 0);
}
var TextBlock = new TextBlock() {
Text = s
};
#if SILVERLIGHT
return new Size(TextBlock.ActualWidth, TextBlock.ActualHeight);
#else
TextBlock.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
return new Size(TextBlock.DesiredSize.Width, TextBlock.DesiredSize.Height);
#endif
}
Ответ 4
Вы можете использовать свойство DesiredSize на визуализированном TextBox, чтобы получить высоту и ширину
using System.Windows.Threading;
...
Double TextWidth = 0;
Double TextHeight = 0;
...
MyTextBox.Text = "Words to measure size of";
this.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new DispatcherOperationCallback(delegate(Object state) {
var size = MyTextBox.DesiredSize;
this.TextWidth = size.Width;
this.TextHeight = size.Height;
return null;
}
) , null);
Если у вас есть большое количество строк, возможно, сначала ускорить предварительную калибровку высоты и ширины каждой условной буквы и символа в данном шрифте, а затем выполнить расчет на основе строковых символов. Это может быть не 100% -ным явлением из-за кернинга и т.д.