测量一个string,而不使用graphics对象?

我使用像素作为我的字体的单位。 在一个地方,我正在执行一个命中testing,以检查用户是否在屏幕上某些文本的边界矩形内单击了。 我需要使用像MeasureString这样的东西。 不幸的是,执行命中testing的代码深藏在一个无法访问Graphics对象甚至Control

如何获得给定字体的string的边界框而不使用Graphics类? 为什么我甚至需要一个Graphics对象,当我的字体是像素?

如果您有对System.Windows.Forms的引用,请尝试使用TextRenderer类。 有一个静态方法(MeasureText),它接受string和字体并返回大小。 MSDN链接

您不需要使用您正在使用的graphics对象来进行测量。 你可以创build一个静态工具类:

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

这也许是值得的,这取决于你的情况来设置位图的dpi。

在@NerdFury答案中的MeasureString方法会给出比预期更高的string宽度。您可以在这里find附加信息。 如果你只想测量物理长度,请添加这两行:

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

这个例子很好的说明了FormattedText的使用。 FormattedText为Windows Presentation Foundation(WPF)应用程序中的绘图文本提供了低级控件。 您可以使用它来测量具有特定字体的string的宽度,而不使用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; } 

包括WindowsBase和PresentationCore库。

这可能不是别人的重复,但我的问题是不需要的graphics对象。 听完上面的挫折后,我简单地试了一下:

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

(其中“内容”是要测量的string,并且是字体)

运气真好 我可以使用结果在VSTO中设置我的列的宽度。