You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows Forms TreeView OwnerDrawText模式初始化前节点重叠问题求助

解决TreeView OwnerDrawText初始化阶段异常渲染问题

核心原因

初始化过程中TreeView尚未完成节点的布局计算,触发DrawNode事件时e.Bounds坐标错误,导致所有节点被绘制在同一行;同时自定义绘制代码的资源泄漏问题会放大渲染延迟,让预渲染现象更明显。

具体解决方案

1. 添加初始化状态标记,跳过未完成时的自定义绘制

  • 在窗体类中添加私有字段标记TreeView是否完成初始化:
    private bool _treeViewInitialized = false;
    
  • 在TreeView的Load事件或节点加载完成后设置标记,并触发一次正确重绘:
    private void myTreeView_Load(object sender, EventArgs e)
    {
        // 加载节点时禁用实时重绘
        myTreeView.BeginUpdate();
        // 执行你的节点添加逻辑...
        myTreeView.EndUpdate();
    
        _treeViewInitialized = true;
        myTreeView.Invalidate();
    }
    
  • 修改DrawNode事件,未初始化时使用默认绘制:
    private void myTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
    {
        if (!_treeViewInitialized)
        {
            e.DrawDefault = true;
            return;
        }
    
        // 原自定义绘制逻辑...
    }
    

2. 优化自定义绘制代码,提升性能

  • 释放GDI资源:创建SolidBrush时用using包裹,避免资源泄漏拖慢渲染:
    using (Brush colorBrush = new SolidBrush(Color.FromArgb(color)))
    {
        e.Graphics.FillRectangle(colorBrush, new Rectangle(e.Bounds.Left + 2, e.Bounds.Top + 2, 10, 10));
    }
    
  • 复用全局字体:确保tagFont是在窗体初始化时创建的全局变量,不要在DrawNode内重复创建。
  • 处理边界情况:当e.Node.Name为null或tagFont未初始化时,强制使用默认绘制,避免异常。

3. 节点加载时禁用实时重绘

添加节点前调用BeginUpdate(),完成后调用EndUpdate(),阻止TreeView在节点添加过程中频繁触发重绘,减少异常渲染的触发次数。

内容的提问来源于stack exchange,提问作者r-m85

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:04:53