删除突出显示并在WinForms ListView C#中添加选择边框

时间:2013-05-06 10:39:37

标签: c# winforms listview selection outline

经过一番搜索,我没有遇到我的具体问题。

我想在C#

中更改WinForm上ListView选择的默认行为

我需要这样做,因为我在单元格中使用自定义颜色来表示对用户必要的元信息。

(我只使用单行选择,即MutiSelect = false;

当我在ListView中选择一行时,默认情况下整行都是高亮蓝色,

Selected Row with Blue Background

相反,我想知道,

如何勾勒出行的边框,而不是更改行中单元格的颜色?

如下所示

Selected Row without Blue Background and dotted line

2 个答案:

答案 0 :(得分:2)

是的,ListView通过将OwnerDraw属性设置为True来支持自定义绘图。这往往是精心设计但你的需求很简单,你可以在这里使用很多默认绘图。只有在选择了某个项目时,您才需要不同的东西。 ControlPaint类可以绘制所需的虚线矩形。实现三个Draw事件处理程序,如下所示:

    private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) {
        e.DrawDefault = true;
    }

    private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) {
        e.DrawBackground();
        e.DrawText();
        if ((e.State & ListViewItemStates.Selected) == ListViewItemStates.Selected) {
            var bounds = e.Bounds;
            bounds.Inflate(-1, -1);
            ControlPaint.DrawFocusRectangle(e.Graphics, bounds);
        }
    }

    private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) {
        e.DrawBackground();
        e.DrawText();
        if ((e.ItemState & ListViewItemStates.Selected) == ListViewItemStates.Selected) {
            var bounds = e.Bounds;
            bounds.Inflate(-1, -1);
            ControlPaint.DrawFocusRectangle(e.Graphics, bounds);
        }
    }

根据需要调整。请注意,您可能还希望实现MouseDown事件,以便用户可以单击任何子项并选择该行。目前尚不清楚它的行为类似于ListView。使用HitTest()方法来实现它。

答案 1 :(得分:0)

无法执行此操作,删除突出显示的唯一方法是自行创建自定义列表视图并覆盖所选项目的绘制方式。

编辑:

试试这个课:

public class NativeListView : System.Windows.Forms.ListView
{
    [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)]
    private extern static int SetWindowTheme(IntPtr hWnd, string pszSubAppName,
                                        string pszSubIdList);

    protected override void CreateHandle()
    {
        base.CreateHandle();

        SetWindowTheme(this.Handle, "explorer", null);
    }
}