未显示根线时,TreeView 将 +- 号添加到根节点[重复]

Posted

技术标签:

【中文标题】未显示根线时,TreeView 将 +- 号添加到根节点[重复]【英文标题】:TreeView Add +- sign to root nodes when root lines are not shown [duplicate] 【发布时间】:2021-04-08 04:05:34 【问题描述】:

我有一个包含多个根节点的树视图。这些根节点不相关,因此通过将ShowRootLines 设置为false 来删除根行。 每个根节点包含多个子节点。

我知道当ShowRootLinesfalse 时,加号/减号将在根节点上禁用,但在必要时仍会在子节点上显示。

但我需要在ShowRootLines = false 时为根节点启用加号/减号。 这可能吗?如何将 +- 符号添加到根节点?

谢谢。

【问题讨论】:

类似this? 【参考方案1】:

这是一种可能的解决方案,它侦听 WM_PAINT 消息,然后删除这些点。

private class MyTreeView : TreeView 

    public static void AddNodes(TreeView tv) 
        var root = tv; //.Add("");
        var a = root.Nodes.Add("A");
        a.Nodes.Add("aa1");
        var aa2 = a.Nodes.Add("aa2");
        aa2.Nodes.Add("aaa1");
        aa2.Nodes.Add("aaa2");
        var b = root.Nodes.Add("B");
        b.Nodes.Add("bb");
        var c = root.Nodes.Add("C");
        c.Nodes.Add("cc");
        tv.ExpandAll();
    

    public MyTreeView() 
        AddNodes(this);
    

    private const int WM_PAINT = 0xf;

    protected override void WndProc(ref Message m) 
        base.WndProc(ref m);
        if (m.Msg == WM_PAINT) 
            EraseRootLines();
        
    

    private void EraseRootLines() 
        using (Graphics g = Graphics.FromHwnd(this.Handle)) 
            using (Bitmap bmp = new Bitmap(16, this.Height)) 
                this.DrawToBitmap(bmp, new Rectangle(0, 0, 16, this.Height));
                int w = 16 - 1;
                int h = this.Height - 1;
                int dotx = 0;
                int doty = 0;
                // find the first single pixel, which gives the x position of the vertical root line to erase
                Color dotc = Color.Empty; // dot color
                Color dotw = Color.Empty; // white color
                for (int j = 1; j < w; j++) 
                    for (int i = 1; i < h; i++) 
                        Color c = bmp.GetPixel(j, i);
                        Color c1 = bmp.GetPixel(j-1, i);
                        Color c2 = bmp.GetPixel(j+1, i);
                        Color c3 = bmp.GetPixel(j, i-1);
                        Color c4 = bmp.GetPixel(j, i+1);
                        if (c != c1 && c1 == c2 && c1 == c3 && c1 == c4) 
                            dotc = c;
                            dotw = c1;
                            dotx = j;
                            doty = i;
                            break;
                        
                    
                

                // scan down the line looking for pixels with a 'white' color on either side
                // this could be optimized to fill by regions rather than individual dots
                for (int i = doty - 2; i < h; i++) 
                    Color c = bmp.GetPixel(dotx, i);
                    Color c3 = bmp.GetPixel(dotx - 1, i);
                    Color c4 = bmp.GetPixel(dotx + 1, i);
                    if (c == dotc && c3 == dotw && c4 == dotw) 
                        g.FillRectangle(Brushes.White, dotx - 2, i - 2, 1, 1);
                    
                
            
        
    

【讨论】:

以上是关于未显示根线时,TreeView 将 +- 号添加到根节点[重复]的主要内容,如果未能解决你的问题,请参考以下文章

treeview - 第一个节点出现/显示在根目录下

是否可以将表单添加到 TreeView?

将数据添加到 QML TreeView

网格中的 Kendo TreeView 显示“未定义”

如何将 ComboBox 添加到 TreeView 列?

在 XAML 中的 TreeView 中未选择任何内容时禁用 TreeView 上下文菜单项