如何更改ListBox选择背景颜色?

它似乎使用Windows设置中的默认颜色,默认为蓝色。 假设我想永久地将它改为红色。 我正在使用Winforms。

提前致谢。

您必须覆盖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(); } 

替代文字

希望这将有助于未来的人,因为上面的代码帮助了我,但不是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网站。

以下代码正是您所说的:

在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

我也有同样的问题。

不幸的是,我的数据源是一个实体类列表。 所以我有相同的代码与上面接受的答案,但稍作修改,以选择我的类上的确切属性,我需要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().Select(c => c.strPropertyName).ElementAt(e.Index), e.Font, Brushes.Black, e.Bounds, StringFormat.GenericDefault); e.DrawFocusRectangle();