Создание владельцем элемента управления LitView сложнее, чем элемента управления ListBox: гораздо больше деталей, о которых нужно позаботиться.Это пример, который рассматривает четыре Просмотр настроек ListView:
View.Details
, View.List
, View.Tile
и View.SmallIcon
.
Здесь рисуется только текст (поэтому View.LargeIcon
не включен), чтобы содержать код до приемлемого предела.
Примером рисования растровых изображений, включенных в ImageList, связанный с ListView, является здесь .
Настройка ListView :
Включите режим ListView OwnerDraw
, затем подпишитесь на его DrawItem , DrawSubItem и DrawColumnHeader события, как показано в примере кода (обязательно, если вы хотите, чтобы ListView отображал что-либо).
Заголовки окрашиваются с использованием рендеринга по умолчанию (настройка e.DrawDefault = true
).
Описание общих операций :
Текст элемента рисуется с использованием TextRenderer.DrawText : это оригинальный метод, используемый ListView для рисования его элементов.Это позволяет точно соответствовать рендерингу по умолчанию, поэтому мы не заметим некоторого неправильного выравнивания текста.
Событие DrawItem
используется для рисования пользовательского фона во всех режимах View
и будет рисовать текст элементов во всех режимах, кроме View.Details где вступает в игру событие DrawSubItems
: мы бы дважды нарисовали текст первого элемента, если событие DrawItem
выполнит ту же задачу.
Событие DrawSubItems
не вызывается, если для View
установлено значение Tile
или List
.
Подробная информация о коде, представленном здесь :
Вспомогательный метод, GetTextAlignment
, заботится о настройке выравнивания элементов, поскольку каждый столбец может иметьконкретное выравнивание текста.
Поле, Color listViewSelectionColor
, используется для установки / изменения цвета выбранных элементов.Чтобы изменить цвет выделения, задайте для этого поля любое значение и Invalidate()
ListView: новый цвет будет применен немедленно.
Пример результатов :
Color listViewSelectionColor = Color.Orange;
protected void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
ListView lView = sender as ListView;
if (lView.View == View.Details) return;
TextFormatFlags flags = GetTextAlignment(lView, 0);
Color itemColor = e.Item.ForeColor;
if (e.Item.Selected) {
using (SolidBrush bkgrBrush = new SolidBrush(listViewSelectionColor)) {
e.Graphics.FillRectangle(bkgrBrush, e.Bounds);
}
itemColor = e.Item.BackColor;
}
else {
e.DrawBackground();
}
TextRenderer.DrawText(e.Graphics, e.Item.Text, e.Item.Font, e.Bounds, itemColor, flags);
if (lView.View == View.Tile && e.Item.SubItems.Count > 1)
{
var subItem = e.Item.SubItems[1];
flags = GetTextAlignment(lView, 1);
TextRenderer.DrawText(e.Graphics, subItem.Text, subItem.Font, e.Bounds, SystemColors.GrayText, flags);
}
}
private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
ListView lView = sender as ListView;
TextFormatFlags flags = GetTextAlignment(lView, e.ColumnIndex);
Color itemColor = e.Item.ForeColor;
if (e.Item.Selected) {
if (e.ColumnIndex == 0 || lView.FullRowSelect) {
using (SolidBrush bkgrBrush = new SolidBrush(listViewSelectionColor)) {
e.Graphics.FillRectangle(bkgrBrush, e.Bounds);
}
itemColor = e.Item.BackColor;
}
}
else {
e.DrawBackground();
}
TextRenderer.DrawText(e.Graphics, e.SubItem.Text, e.SubItem.Font, e.Bounds, itemColor, flags);
}
protected void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
e.DrawDefault = true;
}
private TextFormatFlags GetTextAlignment(ListView lstView, int colIndex)
{
TextFormatFlags flags = (lstView.View == View.Tile)
? (colIndex == 0) ? TextFormatFlags.Default : TextFormatFlags.Bottom
: TextFormatFlags.VerticalCenter;
flags |= TextFormatFlags.LeftAndRightPadding | TextFormatFlags.NoPrefix;
switch (lstView.Columns[colIndex].TextAlign)
{
case HorizontalAlignment.Left:
flags |= TextFormatFlags.Left;
break;
case HorizontalAlignment.Right:
flags |= TextFormatFlags.Right;
break;
case HorizontalAlignment.Center:
flags |= TextFormatFlags.HorizontalCenter;
break;
}
return flags;
}