Как изменить цвет выбора по умолчанию для ListView? - PullRequest
1 голос
/ 03 апреля 2019

Я пытаюсь изменить стандартный (синий) цвет панели выбора в ListView.
Я отказываюсь использовать ObjectListView, так как мне придется изменить весь код.

Я искал по этой теме и нашел здесь несколько ответов:
Изменить цвет выделения фона в ListView?
но это указывает на ObjectListView.

Когда я раньше использовал ListBox, это работало, чтобы установить цвет панели выбора на мой вкус:

  1. Установите DrawMode на OwnerDrawFixed в Свойствах
  2. Установите DrawItem на ListBox1_DrawItem в разделе События

private void ListBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index < 0) return;
    //if the item state is selected them change the back color 
    if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
        e = new DrawItemEventArgs(e.Graphics,
                                  e.Font,
                                  e.Bounds,
                                  e.Index,
                                  e.State ^ DrawItemState.Selected,
                                  e.ForeColor,
                                  Color.FromArgb(43, 144, 188));//Choose the color

    // Draw the background of the ListBox control for each item.
    e.DrawBackground();
    // Draw the current item text
    e.Graphics.DrawString(lb_result.Items[e.Index].ToString(), e.Font, Brushes.Black, e.Bounds, StringFormat.GenericDefault);
    // If the ListBox has focus, draw a focus rectangle around the selected item.
    e.DrawFocusRectangle();
}

Но сейчас я использую ListView.

  1. Я установил OwnerDraw в True
  2. Я установил DrawItem на ListView1_DrawItem

... и используйте код сверху.

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

errors

Как бы я правильно использовал этот код для ListView?

1 Ответ

0 голосов
/ 05 апреля 2019

Создание владельцем элемента управления 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: новый цвет будет применен немедленно.

Пример результатов :

ListView OwnerDraw

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