Как изменить цвет фона выбора ListBox? - PullRequest
12 голосов
/ 08 сентября 2010

Похоже, используется цвет по умолчанию из настроек Windows, который по умолчанию синий.Допустим, я хочу изменить его на красный навсегда.Я использую Winforms.

Заранее спасибо.

Ответы [ 4 ]

39 голосов
/ 08 сентября 2010

Необходимо переопределить событие Drawitem и установить для свойства DrawMode значение DrawMode.OwnerDrawFixed

проверить этот образец

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.Yellow);//Choose the color

    // Draw the background of the ListBox control for each item.
    e.DrawBackground();
    // Draw the current item text
    e.Graphics.DrawString(listBox1.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();
}

alt text

6 голосов
/ 08 января 2012

Надеюсь, это поможет кому-то в будущем, поскольку приведенный выше код помог мне, но не на 100%

У меня все еще были следующие проблемы:- когда я выбрал другой индекс, новый выбранный индекс также будет выделен красным цветом.- когда я изменил размер шрифта списка, выделенная область будет маленькой.

Ниже исправлена ​​эта проблема

  • измените DrawMode на ownerdrawvariable
  • создайте событие MeasurItem и DrawItem для списка
private void lstCartOutput_MeasureItem(object sender, MeasureItemEventArgs e)
{
   // Cast the sender object back to ListBox type.
   ListBox listBox = (ListBox)sender;
   e.ItemHeight = listBox.Font.Height;
}

private void lstCartOutput_DrawItem(object sender, DrawItemEventArgs e)
{
   ListBox listBox = (ListBox)sender;
   e.DrawBackground();
   Brush myBrush = Brushes.Black;

   if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
   {
      myBrush = Brushes.Red;
      e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0, 64, 64)), e.Bounds);
   }

   else
   {
      e.Graphics.FillRectangle(Brushes.White, e.Bounds);

   }

   e.Graphics.DrawString(listBox.Items[e.Index].ToString(),e.Font, myBrush, e.Bounds);
   e.DrawFocusRectangle();
}

Я также ссылался на веб-сайт MSDN .

1 голос
/ 08 сентября 2010

Код ниже делает именно то, что вы говорите:

В методе InitializeComponent:

this.listBox1.DrawMode = DrawMode.OwnerDrawFixed;
this.listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(listBox1_DrawItem);
this.listBox1.SelectedIndexChanged += new System.EventHandler(listBox1_SelectedIndexChanged);

И обработчики событий:

void listBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
    this.listBox1.Invalidate();
}

void listBox1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
{
    int index = e.Index;
    Graphics g = e.Graphics;
    foreach (int selectedIndex in this.listBox1.SelectedIndices)
    {
        if (index == selectedIndex)
        {
            // Draw the new background colour
            e.DrawBackground();
            g.FillRectangle(new SolidBrush(Color.Red), e.Bounds);
        }
    }

    // Get the item details
    Font font = listBox1.Font;
    Color colour = listBox1.ForeColor;
    string text = listBox1.Items[index].ToString();

    // Print the text
    g.DrawString(text, font, new SolidBrush(Color.Black), (float)e.Bounds.X, (float)e.Bounds.Y);
    e.DrawFocusRectangle();
}

Код взятот:

http://www.weask.us/entry/change-listbox-rsquo-selected-item-backcolor-net

0 голосов
/ 28 июля 2017

У меня такая же проблема.

К сожалению, мой источник данных - это список класса сущностей.Таким образом, у меня есть тот же код с принятым ответом выше, но с незначительными изменениями, чтобы выбрать точное свойство в моем классе, которое мне нужно на DrawString для моего ListBox:

 if (e.Index < 0) return;
        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.Yellow);

  e.DrawBackground();
  //This is my modification below:
  e.Graphics.DrawString(ctListViewProcess.Items.Cast<entMyEntity>().Select(c => c.strPropertyName).ElementAt(e.Index), e.Font, Brushes.Black, e.Bounds, StringFormat.GenericDefault);
  e.DrawFocusRectangle();
...