Как разбить метку на несколько строк, если она слишком широкая

Я хочу создать собственное окно сообщений, вот его конструкторы:

    public MBX(string message)
    {
        InitializeComponent();
    }

    public MBX(string message, string title)
    {
        InitializeComponent();
    }

    public MBX(string message, string title, string[] buttons)
    {
        InitializeComponent();
    }

Я хотел бы сделать пустоту, которая переформатирует сообщение, чтобы оно имело ширину менее 444. Вот пример, чтобы помочь вам: допустим, что сообщение было: "abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc" и эта строка имела ширину более 444 пикселей, что void собирается сделать, состоит в том, чтобы разбить его на несколько строк, пока ширина не станет меньше 444, например:

abcabcabcabcabcabcabcabcabcabcabc
abcabcabcabcabcabcabcabcabcabcabc
abcabcabcabc

(Вы можете помнить, как исходное окно сообщения реагирует на длинные строки)

Заранее спасибо! VBТеория

РЕДАКТИРОВАТЬ: Поискав пару недель, я смог найти статью, в которой рассматривается именно эта проблема с переносом слов: http://www.codeproject.com/Articles/51488


person vbtheory    schedule 23.05.2013    source источник
comment
Пробовали ли вы Graphics.MeasureString   -  person I4V    schedule 23.05.2013
comment
Я знаю, как получить длину строки, проблема в том, чтобы знать, где добавить новую строку, чтобы разделить ее.   -  person vbtheory    schedule 23.05.2013
comment
Уверены ли вы? это не то же самое, что string.Length. Просто выполните цикл, пока не получите значение меньше 444.   -  person I4V    schedule 23.05.2013


Ответы (3)


Получите длину строки, если она больше 444, используйте функцию подстроки для анализа всей строки от 0 до 444 и от 444 до string.Length(). Если вторая подстрока все еще больше 444, промойте пену и повторите. Поместите строки в массив строк и для отображения в окне сообщения выполните цикл по массиву, вставляя escape-символ новой строки после каждого элемента строки.

person spurro    schedule 23.05.2013

TextBlock имеет параметры упаковки вместо Label.

<TextBlock
     Text="abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc"
     TextWrapping="Wrap" />
person Fka    schedule 23.05.2013

Для GDI+ есть Graphics.DrawString(), что будет лучше использовать, если вам нужны функции GDI+. Он имеет следующие параметры форматирования: StringFormatFlags

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

Вот хороший пример переноса текста с помощью Graphics.DrawString()

В качестве альтернативы для GDI у вас есть TextRenderer .

TextRenderer.DrawText() предоставляет широкие возможности управления над макетом через TextFormatFlags настройка.

Кроме того, вы можете использовать TextRenderer.MeasureText() для точного измерения текста. Он использует те же вычисления, что и DrawText(), поэтому вы можете использовать их вместе.

person Matthew Watson    schedule 23.05.2013