当前位置: 首页 > news >正文

ListBox控件扩展内容高度自适应,添加图标

在Winform中对Listbox控件,进行扩展,支持根据内容自适应高度,添加图标
在这里插入图片描述
注意点:

  • 图标这里使用的是图片,默认大小设置为20*20,可根据实际情况更改。
  • 消息根据类型,显示不同的图标和字体颜色。

项目结构

在这里插入图片描述

MessaegItem.cs

    // 消息项类public class MessageItem{public string Text { get; set; }public MessageType MessageType { get; set; }public DateTime Timestamp { get; set; }public override string ToString(){return $"[{Timestamp:yyyy-MM-dd HH:mm:ss}]  {Text}";}}

MessageType.cs

    public enum MessageType{Success,Warning,Error,Info,Tip}

ListBoxAutoHeight

    /// <summary>/// 高度自定义/// </summary>public partial class ListBoxAutoHeight : ListBox{// 存储消息的队列,限制为20条private Queue<MessageItem> messageQueue = new Queue<MessageItem>(20);public ListBoxAutoHeight(){InitializeComponent();this.SetStyle(ControlStyles.AllPaintingInWmPaint |ControlStyles.OptimizedDoubleBuffer |ControlStyles.ResizeRedraw |ControlStyles.Selectable |ControlStyles.SupportsTransparentBackColor, true);this.DrawMode = DrawMode.OwnerDrawVariable;// 设置ListBox的项高度,确保能容纳图标和文本//this.ItemHeight = 20;this.DrawItem += ListBoxEx_DrawItem;this.MeasureItem += ListBoxEx_MeasureItem;}private void ListBoxEx_MeasureItem(object sender, MeasureItemEventArgs e){if (e.Index < 0 || e.Index >= this.Items.Count)return;// 获取当前项MessageItem message = (MessageItem)this.Items[e.Index];// 获取图标SizeF size = e.Graphics.MeasureString(message.ToString(), Font);// 15 滚动条的宽度int width = Width - 20 - 10 - 15;float height = size.Height + 3;if (size.Width > width){height = height * 2;}height = Math.Max(height, 24);e.ItemHeight = (int)height;}// 绘制ListBox中的项private void ListBoxEx_DrawItem(object sender, DrawItemEventArgs e){if (e.Index < 0 || e.Index >= this.Items.Count)return;// 获取当前项MessageItem message = (MessageItem)this.Items[e.Index];// 绘制背景e.DrawBackground();int iconWidth = 16;// 获取图标Image icon = GetImageForMessageType(message.MessageType);// 计算绘制位置Rectangle iconRect = new Rectangle(e.Bounds.X + (24 - iconWidth) / 2, e.Bounds.Y + (24 - iconWidth) / 2,iconWidth, iconWidth);// 20 作为icon的宽高int width = e.Bounds.Width - iconWidth - 10;Rectangle textRect = new Rectangle(e.Bounds.X + iconWidth + 10, e.Bounds.Y,width, e.Bounds.Height);// 绘制图标e.Graphics.DrawImage(icon, iconRect, 0, 0, icon.Width, icon.Height, GraphicsUnit.Pixel);// 设置文本格式using (StringFormat format = new StringFormat()){format.Alignment = StringAlignment.Near;format.LineAlignment = StringAlignment.Center;// 根据消息类型设置文本颜色Color textColor = GetTextColorForMessageType(message.MessageType);// 绘制文本e.Graphics.DrawString(message.ToString(),e.Font,new SolidBrush(textColor),textRect,format);}// 绘制焦点矩形e.DrawFocusRectangle();}// 根据消息类型获取图标private Image GetImageForMessageType(MessageType type){switch (type){case MessageType.Success:case MessageType.Info:return Properties.Resources.info;case MessageType.Warning:case MessageType.Error:return Properties.Resources.error;default:return Properties.Resources.info;}}// 根据消息类型获取文本颜色private Color GetTextColorForMessageType(MessageType type){switch (type){case MessageType.Success:case MessageType.Info:return Color.FromArgb(168, 214, 255);case MessageType.Warning:case MessageType.Error:return Color.DarkOrange;default:return Color.Black;}}/// <summary>/// 清空消息/// </summary>public void ClearMessage(){messageQueue.Clear();this.Items.Clear();}/// <summary>/// 添加消息到队列和ListBox/// </summary>/// <param name="text"></param>/// <param name="type"></param>public void AddMessage(MessageItem message){// 如果队列已满,移除最旧的消息if (messageQueue.Count >= 20){messageQueue.Dequeue();this.Items.RemoveAt(0);}// 添加新消息messageQueue.Enqueue(message);this.Items.Add(message);// 滚动到最新消息this.SelectedIndex = this.Items.Count - 1;this.SelectedIndex = -1;}}

UseControlFrm.cs 中按钮绑定事件

        int i = 0;private void addTipButton_Click(object sender, EventArgs e){i++;listBoxEx1.AddMessage(new MessageItem() { Text = $"这是一条提示消息这是一条提示消息这是一条提示消息这是一条提示消息这是一条提示消息这是一条提示消息--{i}", MessageType = MessageType.Tip });}private void addWarningButton_Click(object sender, EventArgs e){i++;listBoxEx1.AddMessage(new MessageItem() { Text = $"这是一条一般信息--{i}", MessageType = MessageType.Info });}private void clearButton_Click(object sender, EventArgs e){i = 0;listBoxEx1.ClearMessage();}private void addInfoButton_Click(object sender, EventArgs e){i++;listBoxEx1.AddMessage(new MessageItem() { Text = $"这是一条警告信息--{i}", MessageType = MessageType.Warning });}
http://www.dtcms.com/a/606061.html

相关文章:

  • 如何将短信从安卓手机传输到电脑
  • 带复选框的combox
  • 门户网站开发价格郑州网站建设(智巢)
  • 主从服务器配置
  • 批量坐标转换(Excel版)
  • 在线C语言编译 | 简化开发流程,提升编程效率
  • 建筑企业网站源码免费创业平台
  • 基于Python野生植物识别应用模型的研究
  • BuildingAI技术架构文档
  • 网站技术支持衡水网站公司
  • 一站式做网站哪家专业wordpress保存远程图片
  • WPS Office v18.22.0 国际版
  • 基于Matlab的数字基带通信系统仿真与性能分析
  • Types of Attributes|属性类型
  • 哈尔滨php网站开发公司深圳做网站 肖先生
  • 户用光伏向阳台转移 阳台光伏开启能源新纪元
  • 11月13日numpy总结——花哨的索引
  • 云望物联无人机图传系统与通信技术的全面解析
  • Google政策大更新:涉及金融(个人贷款),社交约会与游戏(未成年人相关),健康等所有类别App
  • 网站开发建设方案公司介绍网页模板
  • Linux内存管理深度剖析:从处理文件映射页面的缺页异常到页面缓存的完整架构
  • 湖北网站建设哪家有宜昌市住房和城乡建设厅官方网站
  • AK/SK 利用与云平台接管工具
  • ClickHouse CPU 排查快速参考指南
  • ClickHouse CPU 排查详细指南
  • 苍穹外卖 —— Spring Task和WebSocket的运用以及订单统一处理、订单的提醒和催单功能的实现
  • 专门做搞笑视频的网站泉州哪个公司网站做的好
  • 用DeepSeek 编写的BFS python求解程序测试出来的几个难解数独
  • 台州汇客网站建设wordpress 网址导航页面
  • leetcode 3228. 将 1 移动到末尾的最大操作次数 中等