Winforms DotNet Элементы ListBox для переноса слов, если ширина строки содержимого больше ширины ListBox? - программирование

Winforms DotNet Элементы ListBox для переноса слов, если ширина строки содержимого больше ширины ListBox?

Ehm, umm, это означает, что некоторые линии должны быть двухслойными по размеру. Мой босс считает, что это более простое решение, чем ограничение отображаемого текста на ширину и не нравится горизонтальная полоса прокрутки > _ <

4b9b3361

Ответ 1

lst.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
lst.MeasureItem += lst_MeasureItem;
lst.DrawItem += lst_DrawItem;

private void lst_MeasureItem(object sender, MeasureItemEventArgs e)
{
    e.ItemHeight = (int)e.Graphics.MeasureString(lst.Items[e.Index].ToString(), lst.Font, lst.Width).Height;
}

private void lst_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    e.DrawFocusRectangle();
    e.Graphics.DrawString(lst.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds);
}

Ответ 2

Полезная ссылка

Проверьте этот ответ. Он переопределяет шаблон списка с текстовым блоком, который обертывает текст. Надеюсь, это полезно. Чтобы решить вашу проблему, я думаю, что вы добавили: ScrollViewer.HorizontalScrollBarVisibility = "Отключено". Найденный здесь

Ответ 3

private void lst_MeasureItem(object sender, MeasureItemEventArgs e)
{
    e.ItemHeight = (int)e.Graphics.MeasureString(lst.Items[e.Index].ToString(), lst.Font, lst.Width).Height;
}

private void lst_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    e.DrawFocusRectangle();
    e.Graphics.DrawString(lst.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds);
}

Чтобы получить правильный элемент отображения, который будет отображаться при привязке данных, замените

lst.Items[e.Index].ToString()

с литой версией свойства. Поэтому, если ваш источник привязки является классом Object Car, он будет выглядеть как

((Car)lst.Items[e.Index]).YourDisplayProperty

Затем вышеуказанные функции могут правильно измерить строку и нарисовать ее.:)

Ответ 4

Чтобы сделать привязку правильной, обязательно добавьте функцию lst.Items.Count > 0 "в функцию lst_MeasureItem. Вот мой пример:

 if (lst.Items.Count > 0)
 {
    e.ItemHeight = (int)e.Graphics.MeasureString(lst.Items[e.Index].ToString(), lst.Font, lst.Width).Height;
 }

Все остальное, похоже, хорошо работает после этого.