Как программно измерить ширину пикселя строки в ASP.NET?

Как вы получаете размер строки? В Windows Forms это просто, я просто использую графический объект, а затем функцию MeasureString. В ASP.NET я не знаю, как это сделать.

8 ответов


Как говорит Том Галлен. Вы можете просто создать растровое изображение и messure строку. У меня есть этот код, который я использую, чтобы найти ширину/длину в пикселе. Просто измените шрифт и размер.

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

просто хотел показать пример.


Если вы используете JQuery, см. Этот ответ

определить длину пикселя строки в Javascript / jQuery?

Я уверен, что если нет, вы можете работать что-то подобное.


строку.Длина

возвращает длину строки (количество символов).

C#

string MyString = "Stack Overflow String";
Response.Write(MyString.Length);

VB.net

Dim MyString As String = "Stack Overflow String"
Response.Write(MyString.Length);

MSDN Reference

http://msdn.microsoft.com/en-us/library/system.string.length.aspx

Размер Физической Строки Serverside

Я не уверен, почему так много людей по-видимому, решил выдвинуть идея о том, что это "невозможно" сделать на этой стороне сервера, это не так. Вам просто нужно быть немного творческим и быть готовым сделать много тестов.

Я не знаю собственной функции для измерения размеров пикселей строки. Вы можете достичь этого следующими способами. Примечание Вы должны знать:

  • шрифт
  • размер шрифта
  • размеры контейнера (для обертывания текста линии)
  • любые другие правила CSS, такие как интервал между словами, сделают расчет намного менее точным и более сложным. Старайтесь избегать его, если важна точность.

1. Визуализируйте его в изображение и измерьте размер изображения

нарисуйте текст в растровое изображение, а затем измерьте его. Это должно быть достаточно точно.

2. Используйте шрифт фиксированной ширины

если вы используете моноширинный шрифт и текст не оборачиваю, вы можете просто умножить его ширину на количество символов.

3. Грубая оценка

вы можете получить достаточно грубую оценку не фиксированных шрифтов ширины, выбрав некоторое произвольное число ширины символа и умножив его на общие символы. Зависит от того, насколько точно вы хотите быть.


свойство Length для строки можно использовать следующим образом:

http://www.dotnetperls.com/string-length


Это совершенно невозможно сделать на стороне сервера (предполагая, что "ASP.NET", вы имеете в виду веб-страницы, созданные с помощью ASP.NET"). ASP.NET выходы HTML-код, который является языком разметки интерпретируется и оказанные браузером на клиенте. Тот же HTML-код может быть отображен на различных устройствах, в различных браузерах, используя различные шрифты и т. д., в результате чего сильно отличается дисплей.

ваш ASP.NET сайт, выполняющий код на сервере, не знаете, какой шрифт, какое разрешение и т. д. ваш клиент использует. Единственное теоретической способ, которым это можно было бы сделать,-это запустить клиентский код (например, JavaScript, Silverlight, Flash,...) для отчета на сервер. Однако это будет довольно трудно.

Как правило, вам не нужно это делать, вы не хотите этого делать.


@Tom Gullen, @asawyer

Это мое временное решение, и это, кажется, работает сейчас. к вашему сведению, мой проект оказался asp.net приложение с множеством динамических интерфейсов, участвующих в нем (это другая история). На anyrate мой краткосрочного решения опубликован ниже. Im acually с помощью modalpopupextender (с listbox) на лету, когда пользователь нажимает текстовое поле (пользовательский combobox). Ajax combobox работает не очень хорошо, особенно когда их много, и вы не можете установить ширину выпадающего на dropdownlist для.

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

следующий метод предоставит размер строки, отображаемой в данном шрифте:

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