В 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
}