如何在ASP.NET中以编程方式测量字符串像素宽度?
你怎么知道一根绳子的大小?在Windows窗体中很简单,我只使用图形对象,然后使用测量功能。在ASP.NET中,我不确定如何执行此操作。可以对字符串使用Length属性,如下所示: String.Length 返回字符串的长度(字符数) C# VB.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参考资料 服务器端的物理字符串大小 我不知道为
Dim MyString As String = "Stack Overflow String"
Response.Write(MyString.Length);
MSDN参考资料
服务器端的物理字符串大小
我不知道为什么会有这么多人
显然,它决心提出这样一个想法,即“完全不可能”实现这个服务器端,但事实并非如此。你只需要有一点创造性,并愿意做大量的测试
据我所知,没有一个本机函数可以测量字符串的像素尺寸。您可以通过以下方式实现它。注意:您需要知道:
- 字体系列
- 字号
- 容器尺寸(用于文本换行时)
- 任何其他CSS规则(如单词间距)都会使计算变得更加复杂和不精确。如果准确性很重要,尽量避免
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,我从未说过客户端解决方案是错误的。我鼓励并对其他路线感兴趣,请参见我的评论“很好,您已经指出了其他路线。”