2013-05-02 3 views
1

Мы пытаемся измерить ширину текста, как показано (а не количество символов).Winforms to WPF, измерять ширину текста (Graphics.MeasureCharacterRanges)

В Winforms существует метод Grapihcs.MeasureCharacterRanges. В WPF, FormattedText.WidthIncludingTrailingWhitespace. Хотя казалось бы, что это даст ту же ценность, они этого не делают. Почему нет? Для нас Graphics.MeasurecharacterRanges, но мы не можем потянуть winforms только для одного метода. Это приложение WPF.

+0

Может быть, ваш монитор имеет более высокое разрешение, чем 96dpi? WPF является независимым от разрешения, но «графика» - нет, это может объяснить разницу. Поскольку я не уверен в этом, я просто оставляю это как комментарий, а не ответ. –

+0

Возможно, это может помочь? http://stackoverflow.com/questions/632445/measuring-text-in-wpf – series0ne

ответ

0

WPF использует независимое от устройства устройство для большинства измерений графических элементов, и это, вероятно, отличается от единиц, используемых для WinForms. См. this link on MSDN относительно свойства Height для FrameworkElements и используемых единиц измерения.

3

Мы используем следующий вспомогательный класс для выполнения простых текстовых измерений в WPF:

public static class TextUtilities 
{ 
    public static Size MeasureText(string text, 
     FontFamily family, double size, FontStyle style, FontWeight weight, FontStretch stretch, TextFormattingMode formattingMode) 
    { 
     FormattedText formattedText = new FormattedText(
      text, 
      CultureInfo.CurrentCulture, 
      FlowDirection.LeftToRight, 
      new Typeface(family, style, weight, stretch), 
      size, 
      Brushes.Black, 
      null, 
      formattingMode); 

     return new Size(formattedText.Width, formattedText.Height); 
    } 

    public static Size MeasureText(string text, TextBlock textBlock) 
    { 
     return MeasureText(text, 
        textBlock.FontFamily, 
        textBlock.FontSize, 
        textBlock.FontStyle, 
        textBlock.FontWeight, 
        textBlock.FontStretch, 
        TextOptions.GetTextFormattingMode(textBlock)); 
    } 


    public static Size MeasureText(string text, Control control) 
    { 
     return MeasureText(text, control.FontFamily, control.FontSize, 
      control.FontStyle, control.FontWeight, control.FontStretch, 
      TextOptions.GetTextFormattingMode(control)); 
    } 
}