3

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

我想在 C# 中更改 WinForm 上 ListView 选择的默认行为

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

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

当我在 ListView 中选择一行时,整行默认为蓝色,

蓝色背景的选定行

相反,我想知道,

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

如下图所示

没有蓝色背景和虚线的选定行

4

2 回答 2

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() 方法来实现它。

于 2013-05-06T12:55:41.763 回答
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);
    }
}
于 2013-05-06T11:44:33.773 回答