C#TreeView OnDrawNode运行缓慢,正在创建工件

C#TreeView OnDrawNode运行缓慢,正在创建工件,c#,.net,windows,winforms,treeview,C#,.net,Windows,Winforms,Treeview,我正在制作一个自定义的C#TreeView,我想做一些自定义绘制来突出显示节点名称中出现的关键字 我做到了: DrawMode = TreeViewDrawMode.OwnerDrawText; 在自定义树视图的构造函数中,查看并覆盖OnDrawNode: protected override void OnDrawNode(DrawTreeNodeEventArgs e) { if (!e.Node.IsVisible) { return; } if

我正在制作一个自定义的C#TreeView,我想做一些自定义绘制来突出显示节点名称中出现的关键字

我做到了:

DrawMode = TreeViewDrawMode.OwnerDrawText;
在自定义树视图的构造函数中,查看并覆盖OnDrawNode:

protected override void OnDrawNode(DrawTreeNodeEventArgs e)
    {
        if (!e.Node.IsVisible) { return; }
        if (e.Node.Bounds.IsEmpty) { return; }

        e.DrawDefault = false;

        ...draw calls...
但在我这样编码之后,它工作起来很奇怪,感知到的行为包括:

  • OnDrawNode正在调用未展开且不可见的子节点
  • 当TreeView的内容更新时,用户将看到旧内容和新内容同时重叠。旧内容直到半秒或更长时间才会消失
  • 渲染速度比原始绘制调用慢得多
  • 我做的另一个修改是我在这里找到的代码片段,用于抑制树视图更新时发生的闪烁: 但这似乎与问题没有直接关系,因为在删除它后,我仍然可以看到文本重叠

    我想知道是否有人知道这个问题

    任何想法都将不胜感激。 多谢各位

    编辑:

    OnDrawNode的内容如下所示:

    string pattern = keyword;
    if (!string.IsNullOrWhiteSpace(pattern))
    {
        Regex regularExpressionnew = Regex(pattern);
        Match match = regularExpression.Match(e.Node.Text);
        while (match.Success)
        {
            CaptureCollection captureCollection = match.Groups[0].Captures;
            foreach (Capture capture in captureCollection)
            {
                int highlightStartIndex = capture.Index;
                int highlightEndIndex = capture.Index + pattern.Length;
                e.Graphics.FillRectangle(nodeHightLightColor, GetTextBoundsBetweenIndex(e.Graphics, e.Node.Text, highlightStartIndex, highlightEndIndex, e.Bounds));
            }
            match = match.NextMatch();
        }
    
    Brush drawBrush = new SolidBrush(Color.Black);
    e.Graphics.DrawString(e.Node.Text, Font, drawBrush, e.Bounds);
    
    GetTextBoundsBetweenIndex本质上是计算覆盖highlightStartIndex和HighlightdIndex之间字符的平方面积


    但是,如果正则表达式被注释掉,只剩下文本呈现,则会出现延迟和重叠。

    Post代码重现了问题。