我正在尝试更改ListView中选择栏的默认颜色(蓝色)。
我拒绝使用ObjectListView,因为我必须更改所有代码。
我已经搜索了这个主题,并在这里找到了一些答案:
Change background selection color of ListView?
但它指向ObjectListView。
当我以前使用ListBox时,这可以根据我的喜好设置选择栏颜色:
1.在属性下将DrawMode设置为OwnerDrawFixed
1.在事件下将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
1.我将DrawItem设置为ListView1_DrawItem
...并使用上面的代码。
我期望它会像所说的那样向我显示不同的选择颜色,但相反,我得到了一些错误:
如何正确地将这段代码用于ListView?
1条答案
按热度按时间rdrgkggo1#
所有者绘制ListView控件比ListBox控件更复杂:这是一个考虑ListView的四个View设置的示例:
第一个是第二个是第三个。
这里只绘制了Text(这就是为什么不包括
View.LargeIcon
),以将代码限制在一个适当的范围内。绘制链接到ListView的ImageList中包含的位图的示例是here。
设置列表视图:
启用ListView**
OwnerDraw
模式,然后订阅其DrawItem、DrawSubItem和DrawColumnHeader事件,如示例代码中所示(如果希望ListView显示任何内容,则为必填项)。使用默认渲染(设置
e.DrawDefault = true
**)绘制标题。常用操作说明:
项目文本使用TextRenderer.DrawText绘制:这是ListView用来绘制其项目的原始方法。它允许完全匹配默认呈现,因此我们不会注意到文本的一些未对齐。
DrawItem
事件用于在所有**View
模式下绘制自定义背景,并将在除View.Details**(DrawSubItems
事件在其中起作用)以外的所有模式下绘制项目的文本:如果DrawItem
事件执行相同的任务,我们将绘制第一个Item的文本两次。当
View
设定为Tile
或List
时,不会呼叫DrawSubItems
事件。此处提供有关代码的详细信息:
Helper方法**
GetTextAlignment
负责设置Items的对齐方式,因为每个Column可以有特定的文本对齐方式。字段
Color listViewSelectionColor
用于设置/更改所选项目的颜色。要修改所选内容的颜色,请将此字段设置为任意值,然后Invalidate()
**ListView:将立即应用新的颜色。结果示例: