【问题标题】:Remove highlight and add selection border in WinForms ListView C#在 WinForms ListView C# 中删除突出显示并添加选择边框
【发布时间】:2013-05-06 10:39:37
【问题描述】:

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

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

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

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

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

相反,我想知道,

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

如下所示

【问题讨论】:

    标签: c# winforms listview selection outline


    【解决方案1】:

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

    【讨论】:

    • 这可行,但我有一个奇怪的错误。当第一次悬停在一行上而不点击时,在listView1_DrawItem() 中调用函数e.DrawText() 之后,其他子项消失。唯一剩下的是第一列。单击一行后,这不会再次发生。有什么建议吗?
    • 不知道。我怀疑有异常,请查看“输出”窗口。
    • 我仍然有原始的测试代码,它工作得很好,即使 HoverSelection 设置为 True。祝你好运。
    • @son_of_fire 你有没有发现子项目消失了,我也有同样的问题?
    【解决方案2】:

    没有办法做到这一点,删除突出显示的唯一方法是自己创建自定义列表视图并覆盖所选项目的绘制方式。

    编辑:

    试试这门课:

    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);
        }
    }
    

    【讨论】:

    • 你确定吗?这个用户有相反的问题。 stackoverflow.com/questions/9642281/….
    • 不,他也一样,他还想将他的选择外观更改为其他东西(在这种情况下是 Windows 资源管理器样式),您想让它变得透明并突出边框。
    • 无论哪种情况,“选择矩形”都会出现在该问题上,而我的 c#/listview 测试中却没有。如果可以显示“选择矩形”,我可以覆盖对行着色的其他方面。
    • 感谢您的想法,但它似乎不起作用。您的说法是默认主题会影响行为,但是在更改主题后,我的列表视图没有任何变化,例如添加了“选择矩形”。因此,在使用您的课程时,我也没有看到任何变化。也许我忽略了一个设置?还有其他想法吗?感谢您的帮助!
    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2021-05-03
    • 2016-02-13
    • 2012-12-11
    相关资源
    最近更新 更多