¿Mide una cadena sin usar un objeto de gráficos?

Estoy usando píxeles como la unidad para mi fuente. En un lugar, realizo una prueba de impacto para verificar si el usuario ha hecho clic dentro del rectángulo delimitador de algún texto en la pantalla. Necesito usar algo como MeasureString para esto. Lamentablemente, el código que realiza la prueba de detección es profundo dentro de una biblioteca que no tiene acceso a un objeto Graphics o incluso a un Control .

¿Cómo obtengo el cuadro delimitador de una cadena dada la fuente sin usar la clase Graphics ? ¿Por qué incluso necesito un objeto Graphics cuando mi fuente está en píxeles?

Si tiene una referencia a System.Windows.Forms, intente utilizar la clase TextRenderer. Hay un método estático (MeasureText) que toma la cadena y la fuente y devuelve el tamaño. MSDN Link

No necesita usar el objeto de gráficos que está utilizando para procesar para medir. Podría crear una clase de utilidad estática:

 public static class GraphicsHelper { public static SizeF MeasureString(string s, Font font) { SizeF result; using (var image = new Bitmap(1, 1)) { using (var g = Graphics.FromImage(image)) { result = g.MeasureString(s, font); } } return result; } } 

Puede valer la pena, dependiendo de su situación, establecer los ppp del bitmap también.

MeasureString método MeasureString en la respuesta de @NerdFury dará un ancho de cadena mayor al esperado. Información adicional que puede encontrar aquí . Si desea medir solo la longitud física, agregue estas dos líneas:

 g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; result = g.MeasureString(measuredString, font, int.MaxValue, StringFormat.GenericTypographic); 

Este ejemplo hace un excelente trabajo al ilustrar el uso de FormattedText. FormattedText proporciona un control de bajo nivel para dibujar texto en las aplicaciones de Windows Presentation Foundation (WPF). Puede usarlo para medir el ancho de una cadena con una fuente particular sin usar un objeto Graphics.

 public static float Measure(string text, string fontFamily, float emSize) { FormattedText formatted = new FormattedText( item, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, new Typeface(fontFamily), emSize, Brushes.Black); return formatted.Width; } 

Incluye bibliotecas WindowsBase y PresentationCore.

Esto puede no ser sino una repetición de otros, pero mi problema fue el objeto Graphics no deseado también. Después de escuchar las frustraciones anteriores, simplemente intenté:

 Size proposedSize = new Size(int.MaxValue, int.MaxValue); TextFormatFlags flags = TextFormatFlags.NoPadding; Size ressize = TextRenderer.MeasureText(content, cardfont, proposedSize, flags); 

(donde ‘contenido’ es la cadena para medir y la fuente de la fuente en la que se encuentra)

… y estuvo de suerte. Podría usar el resultado para establecer el ancho de mi columna en VSTO.