【问题标题】:Is there a way to estimate label width dynamically based on number of chars?有没有办法根据字符数动态估计标签宽度?
【发布时间】:2011-07-01 17:17:25
【问题描述】:

我有一列标签,我想将其设置为与最宽的文本一样宽。如果我在网页中使用“小”字号,是否可以根据可用的最大文本字符串估算标签的宽度?

这适用于带有 c# 的 ASP.net。

谢谢!

【问题讨论】:

  • 没有。即使使用等宽字体,大小也会在操作系统/浏览器/设备之间变化。渲染后,您只能在客户端使用 JavaScript 计算文本的宽度。

标签: html dynamic label width


【解决方案1】:

将 HTML 渲染成一个假的虚拟和 隐藏 div,在页面外的某个地方,然后使用 Javascript/jQuery 来测量 div 的大小,它随着文本的增长而增长。不要忘记应用 css white-space: nowrap;,这样它的宽度就会永远增长。

【讨论】:

    【解决方案2】:

    从这个开始: http://www.davidthielen.info/programming/2005/10/getting_accurat.html

    我能够对其进行调整以获得以下对我来说非常有用的代码:

    private static float MAX_RECT = 100000;
        private static float BITMAP_DPI = 2400;
        private static float ADJUST_TO_POINTS = 72.0f / BITMAP_DPI;
    
        public static float GetTextWidth(String fontname, float fontsize, FontStyle style, String text)
        {
            System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(1, 1);
            bmp.SetResolution(BITMAP_DPI, BITMAP_DPI);
            System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bmp);
            graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    
            System.Drawing.StringFormat fmt = System.Drawing.StringFormat.GenericTypographic;
            fmt.Trimming=System.Drawing.StringTrimming.None;
            fmt.FormatFlags=System.Drawing.StringFormatFlags.MeasureTrailingSpaces | System.Drawing.StringFormatFlags.NoWrap;
    
            System.Drawing.Font font = new System.Drawing.Font(fontname, fontsize, style, System.Drawing.GraphicsUnit.Point);
    
            System.Drawing.RectangleF rect = new System.Drawing.RectangleF(0, 0, MAX_RECT, MAX_RECT);
            fmt.SetMeasurableCharacterRanges(new System.Drawing.CharacterRange[] { new System.Drawing.CharacterRange(0, text.Length) });
    
            System.Drawing.Region[] rgns = graphics.MeasureCharacterRanges(text, font, rect, fmt);
            rect = rgns[0].GetBounds(graphics);
            return rect.Width * ADJUST_TO_POINTS;
        }
    
        private static float GetLabelWidth(RS2005.ReportParameter[] parameters, String fontname, double fontSizeUnitVal, FontStyle style, String text)
        {
            float emSize = Convert.ToSingle(fontSizeUnitVal + 1);
            emSize = (emSize == 0 ? 12 : emSize);
    
            int pCnt = parameters.Count();
            string txt;
            float size = 0;
                for (int i = 0; i < pCnt; i++)
                {
                    txt = parameters[i].Prompt == null ? parameters[i].Prompt : parameters[i].Name;
                    var width=GetTextWidth(fontname, emSize, style, txt);
    
                    if (width > size)
                        size = width;                                        
                }
    
                return size;            
        }
    

    我这样称呼它:

    size = GetLabelWidth(parameters, pPromptLbl.Font.Name, pPromptLbl.Font.Size.Unit.Value, FontStyle.Bold, pPromptLbl.Text);
    
                    pPromptLbl.Width = Unit.Parse(Math.Round(size+30, 0).ToString());
    

    【讨论】:

    • 如何确定用户安装了哪些字体?
    • 我没有。我只是选择一种字体来使用和处理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2021-10-17
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    相关资源
    最近更新 更多