更改WinForms的ListView选中和非焦点高亮颜色

5
我想将ListViewItem的高亮颜色设置为与ListView当前处于焦点状态时相同的颜色,即使它不是。将HideSelection属性设置为False后,当我选择一个项目并聚焦到另一个视图时,颜色会变灰。我想禁用这个功能。如何实现呢?类似于这个与WPF相关的问题(包括演示截图):WPF ListView Inactive Selection Color

如果它与链接中的代码类似,为什么不遵循相同的概念呢?问题出在哪里?您是否熟悉使用调试器来检查属性并在QuickWatch编辑器中更改它们? - MethodMan
2个回答

16

由于 Windows Forms ListView 没有 SelectionBackColor 或类似的属性(据我所知),我认为最简单的方法是:

将列表视图的 HideSelection 属性设置为 true,然后:

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    this.listView1.Items.Cast<ListViewItem>()
        .ToList().ForEach(item =>
        {
            item.BackColor = SystemColors.Window;
            item.ForeColor = SystemColors.WindowText;
        });
    this.listView1.SelectedItems.Cast<ListViewItem>()
        .ToList().ForEach(item =>
        {
            item.BackColor = SystemColors.Highlight;
            item.ForeColor = SystemColors.HighlightText;
        });
}

3
太棒了!我刚在谷歌上寻找资料时发现了这篇文章。谢谢!但需要注意的是,如果您已经使用不同颜色格式化了列表视图,那么这将覆盖这些行项目的颜色,除非您添加更多代码以保持它们原来的颜色。 - David Bentley

8

与Reza的想法类似,但更加高效:

private void uxListViewTest_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) {
    if (e.IsSelected) {
        e.Item.BackColor = SystemColors.Highlight;
        e.Item.ForeColor = SystemColors.HighlightText;
    }
    else {
        e.Item.BackColor = BackColor;
        e.Item.ForeColor = ForeColor;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接