如何在ASP.NET中以编程方式测量字符串像素宽度?

如何在ASP.NET中以编程方式测量字符串像素宽度?,asp.net,string,code-behind,Asp.net,String,Code Behind,你怎么知道一根绳子的大小?在Windows窗体中很简单,我只使用图形对象,然后使用测量功能。在ASP.NET中,我不确定如何执行此操作。可以对字符串使用Length属性,如下所示: String.Length 返回字符串的长度(字符数) C# VB.net Dim MyString As String = "Stack Overflow String" Response.Write(MyString.Length); MSDN参考资料 服务器端的物理字符串大小 我不知道为

你怎么知道一根绳子的大小?在Windows窗体中很简单,我只使用图形对象,然后使用测量功能。在ASP.NET中,我不确定如何执行此操作。

可以对字符串使用Length属性,如下所示:

String.Length 返回字符串的长度(字符数)

C#

VB.net

Dim MyString As String = "Stack Overflow String"
Response.Write(MyString.Length);
MSDN参考资料

服务器端的物理字符串大小 我不知道为什么会有这么多人 显然,它决心提出这样一个想法,即“完全不可能”实现这个服务器端,但事实并非如此。你只需要有一点创造性,并愿意做大量的测试

据我所知,没有一个本机函数可以测量字符串的像素尺寸。您可以通过以下方式实现它。注意:您需要知道:

  • 字体系列
  • 字号
  • 容器尺寸(用于文本换行时)
  • 任何其他CSS规则(如单词间距)都会使计算变得更加复杂和不精确。如果准确性很重要,尽量避免
1。将其渲染为图像并测量图像大小

将文本绘制为位图,然后测量它。这应该相当准确

2。使用固定宽度字体

Dim MyString As String = "Stack Overflow String"
Response.Write(MyString.Length);
如果您使用的是固定宽度字体,而文本不换行,则只需将其宽度乘以字符数即可

3。粗略估计


通过选取一些任意字符宽度的数字并将其乘以总字符数,可以对非固定宽度字体进行合理的粗略估计。取决于您希望的准确度。

如果您使用的是JQuery,请参阅此答案


如果没有,我相信您也可以做类似的工作。

在服务器端做这件事是完全不可能的(假设“ASP.NET”,您指的是使用ASP.NET创建的网页)。ASP.NET输出HTML,这是一种由客户端浏览器解释和呈现的标记语言。相同的HTML代码可以在不同的设备、不同的浏览器、使用不同的安装字体等上显示,从而导致不同的显示效果

在服务器上运行代码的ASP.NET站点不知道客户端使用的字体、分辨率等。理论上唯一可以做到这一点的方法是运行客户端代码(例如JavaScript、Silverlight、Flash等)向服务器报告。然而,这将是相当困难的

一般来说,你不需要那样做,你也不想那样做。

@tomgullen,@asawyer

这是我的临时解决方案,目前看来效果不错。仅供参考,我的项目碰巧是一个asp.net应用程序,其中涉及许多动态接口(这是另一个故事)。无论如何,我的短期解决方案张贴在下面。当用户单击文本框(自定义组合框)时,即时使用ModalPopupXtender(带listbox)进行即时通信。ajax组合框工作得不太好,特别是当有很多组合框并且您无法在下拉列表上设置下拉宽度时

Friend Function ResizePopup(ByVal sender As Object, ByVal standardwidth As Integer) As Integer
    Dim lst As ListBox = CType(sender, ListBox)
    Dim itemlength As Single = 0

    'get longest string length
    For Each item As ListItem In lst.Items
        If item.Text.Length > itemlength Then
            itemlength = item.Text.Length
        End If
    Next

    'set a general multiplier
    Dim newWidth As Integer = itemlength * 7

    'compare to width of control, if larger, then use value else return control width
    If newWidth > standardwidth Then
        Return newWidth
    Else
        Return standardwidth
    End If

End Function

就像汤姆·古伦所说的。您只需创建位图并测量字符串即可。我有这个代码,我用它来计算像素的宽度/长度。只需更改字体和大小

// Bitmap class namespace:
using System.Drawing;

...

private float GetWidthOfString(string str)
{
    Bitmap objBitmap = default(Bitmap);
    Graphics objGraphics = default(Graphics);

    objBitmap = new Bitmap(500, 200);
    objGraphics = Graphics.FromImage(objBitmap);

    SizeF stringSize = objGraphics.MeasureString(str, new Font("Arial", 12));

    objBitmap.Dispose();
    objGraphics.Dispose();
    return stringSize.Width;
}

只想显示一个示例。

以下方法将提供以给定字体呈现的字符串的大小:

private RectangleF sizeOfString(string text, Font font)
{
    GraphicsPath path = new GraphicsPath();
    path.AddString(text, font.FontFamily, (int)font.Style, font.Size, new Point(0, 0), new StringFormat());
    return path.GetBounds();
}
然后,您可以使用它来获得宽度,如下所示

float width = sizeOfString("Hello World", someFont).Width;

@Eystein Bye的解决方案,使用以下方法略微清洁:

using (Bitmap objBitmap = new Bitmap(5000, 200))
{
     using (Graphics objGraphics = Graphics.FromImage(objBitmap))
     {
          SizeF stringSize = objGraphics.MeasureString(txt, new Font("Arial", 12));
          return stringSize.Width;
     }
}

您是否试图获取屏幕上字符串的像素大小或字符串的长度(以字符为单位)?我试图获取像素宽度,以便在使用ASP.NET创建Web应用程序时,可以通过编程将dropdownlist的大小调整为最大字符串…这将有点困难。您是否试图使页面上的所有输入具有相同的统一宽度?如果没有,浏览器将自动为您调整大小,只要您不指定宽度。对于向下投票者,他提到“图形对象,然后是MeasureString函数”。即他想要渲染字符串的像素宽度。唯一的方法是客户端,提供的链接显示了一种确定方法。您必须调整客户端加载下拉列表的大小,查找body load事件,然后确定大小,然后调整列表的大小。“唯一的方法是客户端”,这恐怕是错误的。虽然这很好,但您已经指出了另一种解决方案。好吧,“相对准确的唯一方法是客户端”?:)“这是一个更好地满足您需求的替代解决方案”怎么样?我以前尝试过,但是我必须将它乘以一个文本字符的平均像素宽度,这有点粗略。仅供参考,客户端可以控制,可以覆盖并取消所有这些计算。唯一可靠的方法是渲染到一个临时范围中,并使用客户端函数来度量它。@Asawyer,如果客户端禁用了Javascript怎么办?你必须在某个时候做出妥协。如果字体被指定为12px并且是新的,那么您可以非常安全地假设它将被呈现。他特别要求提供一个服务器端解决方案,这就是我试图为他提供的。@Tom如果客户机没有启用脚本(我通常没有),他们会在网页上获得不符合标准的体验。我不认为有必要编写一个缓慢/资源密集型的位图渲染方案来处理这种情况,如果你的答案很有可能是错误的,而且你根本无法知道(除了一封愤怒的电子邮件之外)你在何时何地犯了严重的错误。这只是我的意见。:)@Mormegil,我从未说过客户端解决方案是错误的。我鼓励并对其他路线感兴趣,请参见我的评论“很好,您已经指出了其他路线。”