2009-05-05 23 views
13

He usado TextRenderer para medir la longitud de una cadena y, por lo tanto, ajustar el tamaño de un control de forma adecuada. ¿Hay un equivalente en WPF o puedo simplemente usar TextRendered.MeasureString?WPF equivalente a TextRenderer

Respuesta

3

Tome un vistazo a la FormattedText class

Si necesita un control más granular, a continuación, que había necesidad de descender al miembro del tipo GlyphTypeface AdvanceWidths. Encontré un similar discussion aquí con un fragmento de código que parece que podría funcionar.

Actualización: Parece que esto puede ser un duplicado de Measuring text in WPF .. OP confirmar.

18

Gracias Gishu,

lectura de sus enlaces que se le ocurrió la siguiente ambos de los cuales hacer el trabajo para mí:

/// <summary> 
    /// Get the required height and width of the specified text. Uses FortammedText 
    /// </summary> 
    public static Size MeasureTextSize(string text, FontFamily fontFamily, FontStyle fontStyle, FontWeight fontWeight, FontStretch fontStretch, double fontSize) 
    { 
     FormattedText ft = new FormattedText(text, 
              CultureInfo.CurrentCulture, 
              FlowDirection.LeftToRight, 
              new Typeface(fontFamily, fontStyle, fontWeight, fontStretch), 
              fontSize, 
              Brushes.Black); 
     return new Size(ft.Width, ft.Height); 
    } 

    /// <summary> 
    /// Get the required height and width of the specified text. Uses Glyph's 
    /// </summary> 
    public static Size MeasureText(string text, FontFamily fontFamily, FontStyle fontStyle, FontWeight fontWeight, FontStretch fontStretch, double fontSize) 
    { 
     Typeface typeface = new Typeface(fontFamily, fontStyle, fontWeight, fontStretch); 
     GlyphTypeface glyphTypeface; 

     if(!typeface.TryGetGlyphTypeface(out glyphTypeface)) 
     { 
      return MeasureTextSize(text, fontFamily, fontStyle, fontWeight, fontStretch, fontSize); 
     } 

     double totalWidth = 0; 
     double height = 0; 

     for (int n = 0; n < text.Length; n++) 
     { 
      ushort glyphIndex = glyphTypeface.CharacterToGlyphMap[text[n]]; 

      double width = glyphTypeface.AdvanceWidths[glyphIndex] * fontSize; 

      double glyphHeight = glyphTypeface.AdvanceHeights[glyphIndex]*fontSize; 

      if(glyphHeight > height) 
      { 
       height = glyphHeight; 
      } 

      totalWidth += width; 
     } 

     return new Size(totalWidth, height); 
    }