news 2026/4/15 18:12:32

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/4/15 18:12:32

Kafka副本管理核心:ReplicaManager揭秘

Apache Kafka Broker 端核心组件 ReplicaManager它是 Kafka 实现 副本管理、ISR&#xff08;In-Sync Replicas&#xff09;维护、Leader/Follower 同步、日志存储协调 的中枢。 下面我将从 整体定位、关键字段、核心机制、工作流程 四个维度&#xff0c;帮你系统性理解这段代码…

作者头像 李华
网站建设 2026/4/15 16:25:03

西门子smart SB CM01与3台台达DT330温控器485通讯程序开发记录

西门子smart SB CM01与3台台达DT330温控器485通讯程序(XMZ200-4)器件&#xff1a;西门子s7 200 smart PLC&#xff0c;扩展模块SB CM01&#xff0c;3台台达DT330温控器。 昆仑通态触摸屏(带以太网)&#xff0c;中途可以加路由器 控制方式&#xff1a;触摸屏与plc以太网通讯&…

作者头像 李华
网站建设 2026/4/12 14:49:01

大模型从0到精通:蒙眼下山法-AI如何一步步“摸索”到最优解?

本文是《大模型从0到精通》系列第一卷“奠基篇”的第三章。上章我们建立了“错题山谷”和评分标准(损失函数),但怎么找到山谷最低点?本章将引入梯度下降——AI在“错题山谷”中蒙眼下山的寻路算法,这是驱动所有AI(包括千亿参数大模型)学习的核心引擎。 一、蒙眼下山:一…

作者头像 李华
网站建设 2026/4/8 9:51:25

接口自动化测试中解决接口间数据依赖

在实际的测试工作中&#xff0c;在做接口自动化测试时往往会遇到接口间数据依赖问题&#xff0c;即API_03的请求参数来源于API_02的响应数据&#xff0c;API_02的请求参数又来源于API_01的响应数据。 因此通过自动化方式测试API_03接口时&#xff0c;需要预先请求API_02接口&a…

作者头像 李华
网站建设 2026/4/10 17:27:26

揭秘Rust编写PHP扩展的调试难题:5个关键技巧让你效率翻倍

第一章&#xff1a;Rust 扩展的 PHP 函数调试在现代高性能 Web 开发中&#xff0c;使用 Rust 编写 PHP 扩展已成为提升关键函数执行效率的重要手段。然而&#xff0c;当 PHP 调用由 Rust 实现的函数出现异常时&#xff0c;传统的 PHP 调试工具往往无法深入追踪问题根源。为此&a…

作者头像 李华
网站建设 2026/4/9 20:30:02

基于单片机的立体车库设计

一、系统设计背景与总体架构 随着城市汽车保有量激增&#xff0c;传统平面车库土地利用率低、停车难问题日益突出&#xff0c;立体车库凭借空间利用率高、占地面积小的优势成为解决方案。基于单片机的立体车库设计&#xff0c;以低成本、高可靠性为核心目标&#xff0c;采用模块…

作者头像 李华