39

Вопрос по text, c# – Измерить строку без использования графического объекта?

Я использую пиксели в качестве единицы для моего шрифта. В одном месте я выполняю тест на попадание, чтобы проверить, нажал ли пользователь внутри ограничительного прямоугольника какого-либо текста на экране. Мне нужно использовать что-то вродеMeasureString за это. К сожалению, код, выполняющий тест на попадание, находится глубоко внутри библиотеки, которая не имеет доступа кGraphics объект или дажеControl.

Как получить ограничивающую рамку строки с учетом шрифта без использованияGraphics учебный класс? Зачем мне вообще нуженGraphics объект, когда мой шрифт в пикселях?

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededWindowsGraphicsCacheManagerError: User Rate Limit ExceededMeasurementGraphicsError: User Rate Limit Exceededthis constructorError: User Rate Limit Exceededthis constructorError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • НоTextRendererError: User Rate Limit ExceededDrawTextError: User Rate Limit ExceededGraphicsError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededTextRenderer.DrawText(e.Graphics,

    от
  • Что у вас есть, если у вас нет контроля? Я предполагаю Шрифт и строку, но есть ли что-нибудь еще?

    от micahtan
  • Ничего больше. Моя библиотека - это своего рода Сценограф. Я пытаюсь избежать зависимости от System.Drawing и System.Windows.Forms

    от Agnel Kurian
5 ответов
  • 10

    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias

    MeasureString метод в ответе @NerdFury даст большую ширину строки, чем ожидалось. Дополнительную информацию вы можете найтиВот, Если вы хотите измерить только физическую длину, пожалуйста, добавьте эти две строки:

    
    result = 
      g.MeasureString(measuredString, font, int.MaxValue, StringFormat.GenericTypographic);
    

  • 46

    Если у вас есть ссылка на System.Windows.Forms

    попробуйте использовать класс TextRenderer. Есть статический метод (MeasureText), который принимает строку и шрифт и возвращает размер.MSDN Link

  • 23

    Вам не нужно использовать графический объект

    который вы используете для визуализации, для измерения. Вы можете создать статический служебный класс:

    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 для растрового изображения.

  • 0

    Возможно

    это не повторение других, но моей проблемой был также нежелательный объект Graphics. Выслушав вышеуказанные разочарования, я просто попытался:

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

    (где «content» - строка для измерения и определения шрифта, в которой она находится)

    ... и повезло. Я мог бы использовать результат, чтобы установить ширину моего столбца в VSTO.

  • 1

    Этот пример отлично иллюстрирует использование FormattedText. Formatte

    dText обеспечивает низкоуровневое управление для рисования текста в приложениях Windows Presentation Foundation (WPF). Вы можете использовать его для измерения ширины строки с определенным шрифтом без использования графического объекта.

    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.