news 2026/5/12 12:02:22

WinForms的TreeView默认不支持多行显示,需通过自定义绘制(OwnerDraw)实现节点多行文本渲染,同时调整节点高度适配多行内容

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WinForms的TreeView默认不支持多行显示,需通过自定义绘制(OwnerDraw)实现节点多行文本渲染,同时调整节点高度适配多行内容

using System;
using System.Drawing;
using System.Windows.Forms;

namespace TreeViewMultiLine
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
InitTreeView();
}

private void InitTreeView()
{
// 1. 配置TreeView自绘模式
TreeView treeView1 = new TreeView
{
Dock = DockStyle.Fill,
DrawMode = TreeViewDrawMode.OwnerDrawText, // 开启自绘文本
Font = new Font("微软雅黑", 9F)
};
this.Controls.Add(treeView1);

// 2. 添加带多行文本的节点
TreeNode rootNode = new TreeNode("知识结构\n(一级节点)\n创建时间:2025-12-15");
TreeNode childNode = new TreeNode("WinForms开发\nTreeView多行实现\n核心:自定义绘制");
rootNode.Nodes.Add(childNode);
treeView1.Nodes.Add(rootNode);

// 3. 绑定DrawNode事件处理多行绘制
treeView1.DrawNode += TreeView1_DrawNode;
// 4. 展开所有节点
treeView1.ExpandAll();
}

private void TreeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
// 绘制节点背景(选中/未选中状态)
e.DrawDefault = false;
Color backColor = e.Node.IsSelected ? SystemColors.Highlight : e.Node.BackColor;
using (Brush backBrush = new SolidBrush(backColor))
{
e.Graphics.FillRectangle(backBrush, e.Bounds);
}

// 计算多行文本的尺寸并调整节点高度
SizeF textSize = e.Graphics.MeasureString(e.Node.Text, e.Node.Font, e.Bounds.Width);
if (e.Node.Bounds.Height < textSize.Height)
{
e.Node.Height = (int)Math.Ceiling(textSize.Height);
}

// 绘制多行文本(自动换行)
Color foreColor = e.Node.IsSelected ? SystemColors.HighlightText : e.Node.ForeColor;
using (Brush foreBrush = new SolidBrush(foreColor))
{
// 使用TextRenderer绘制支持换行的文本
TextRenderer.DrawText(
e.Graphics,
e.Node.Text,
e.Node.Font,
e.Bounds,
foreColor,
backColor,
TextFormatFlags.WordBreak | TextFormatFlags.Left);
}

// 绘制节点连接线(可选)
if ((e.State & TreeNodeStates.Selected) != 0)
{
ControlPaint.DrawFocusRectangle(e.Graphics, e.Bounds);
}
}
}
}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 20:48:33

Kafka日志迁移与查询机制解析

Kafka Broker 端用于管理日志目录&#xff08;Log Directory&#xff09;迁移和查询 的核心逻辑&#xff0c;分别对应两个关键 API&#xff1a; alterReplicaLogDirs(...)&#xff1a;实现 KIP-113 中的 ALTER_REPLICA_LOG_DIRS 请求&#xff0c;用于将某个分区的日志从一个磁盘…

作者头像 李华
网站建设 2026/4/30 22:56:50

Kafka核心揭秘:ReplicaManager如何保障高可用

ReplicaManager 是 Apache Kafka Broker 中最核心的副本管理组件&#xff0c;负责协调分区副本&#xff08;Replica&#xff09;的生命周期、数据复制、一致性保障、故障恢复以及与集群控制器&#xff08;Controller&#xff09;的交互。它是 Kafka 实现 高可用、持久化、Exact…

作者头像 李华
网站建设 2026/5/10 23:00:17

5类实时交通检测数据集实战指南(附代码)

5类实时交通自建目标检测数据集 该数据集包括car&#xff0c;light&#xff0c;moto&#xff0c;person&#xff0c;signs等5个类别 总计图片1498张&#xff0c;训练集998张图像&#xff0c;验证集和测试集分别是250张图片 数据集已经划分为训练集/验证集/测试集 数据集支持YOL…

作者头像 李华
网站建设 2026/5/10 15:02:58

批判性思维训练:5个练习提升你的缺陷发现能力

批判性思维在软件测试中的核心价值 在快速迭代的软件开发周期中&#xff0c;测试人员面临的不仅仅是功能验证的挑战&#xff0c;更是对系统深层次风险的前瞻性洞察。批判性思维使测试工程师能够超越表面需求&#xff0c;通过系统性质疑、多角度分析来暴露潜在缺陷。这种能力直…

作者头像 李华
网站建设 2026/5/8 21:41:45

【生存分析进阶指南】:从零构建高精度临床预测模型的7个关键步骤

第一章&#xff1a;临床数据的 R 语言 Cox 回归优化概述在临床研究中&#xff0c;生存分析是评估患者预后和治疗效果的核心方法之一。Cox 比例风险回归模型因其能够处理删失数据并同时评估多个协变量的影响而被广泛使用。借助 R 语言强大的统计计算与可视化能力&#xff0c;研究…

作者头像 李华
网站建设 2026/5/8 21:41:47

紧急预警:传统相关性分析已过时,你必须掌握的Copula参数估计新范式

第一章&#xff1a;紧急预警&#xff1a;传统相关性分析已过时&#xff0c;你必须掌握的Copula参数估计新范式在金融风险建模、极端事件预测和多变量依赖结构分析中&#xff0c;传统皮尔逊相关系数已暴露出严重局限——它仅能捕捉线性关系&#xff0c;且对尾部依赖无能为力。现…

作者头像 李华