# ELEControls **Repository Path**: jinyutou/elecontrols ## Basic Information - **Project Name**: ELEControls - **Description**: 基于 Element UI Plus 设计体系的 WinForms 自定义组件库,采用纯 GDI+ 绘制,提供 123 个开箱即用的主题化控件,覆盖基础、表单、数据展示、导航、反馈、布局、图表、工业控制八大类。 - **Primary Language**: C# - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-23 - **Last Updated**: 2026-06-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ELEControls 基于 **Element UI Plus** 设计体系的 **WinForms 自定义组件库**,采用纯 GDI+ 绘制,提供 **123 个**开箱即用的主题化控件,覆盖基础、表单、数据展示、导航、反馈、布局、图表、工业控制八大类。 > 免费开源 | .NET 8 + .NET Framework 4.8 | 纯 GDI+ | VS 设计器友好 | 12 套内置主题 --- ## 特性 - **Element UI Plus 风格** — 完整移植 Web 端设计令牌(色彩、圆角、间距、阴影)到桌面端 - **纯 GDI+ 渲染** — 不依赖第三方绘图库,双缓冲 + 抗锯齿,流畅无闪烁 - **主题系统** — 内置 12 套配色方案,支持运行时一键切换,可自定义扩展 - **DPI 自适应** — 内置 `ELEDPIScale` 缩放因子,高分屏下自动适配 - **VS 设计器支持** — 所有控件均可在 Visual Studio 可视化设计器中拖放使用 - **统一命名空间** — 所有类型统一在 `ELE.UI` 命名空间下,引用即用 - **工业控件** — 提供仪表盘、液位罐、风机、泵、阀门等 SCADA 级工控组件 --- ## 环境要求 | 项目 | 要求 | |------|------| | 框架 | .NET 8.0 (net8.0-windows) **或** .NET Framework 4.8 (net48) | | IDE | Visual Studio 2022 17.8+ | | 系统 | Windows 10 / 11 | | 许可 | MulanPSL-2.0 | --- ## 快速开始 ### 1. 引用项目 将 `src\ELEControls` 项目添加到你的解决方案中,然后在 WinForms 项目里添加项目引用: ```xml ``` ### 2. 引入命名空间 ```csharp using ELE.UI; ``` ### 3. 使用控件 **代码方式:** ```csharp var btn = new ELEButton { Text = "主要按钮", Type = ELEComponentType.Primary, Size = ELEComponentSize.Default, Location = new Point(20, 20) }; this.Controls.Add(btn); ``` **设计器方式:** 编译项目后,所有 ELE 控件会自动出现在 VS 工具箱的 **ELEControls** 分类中,直接拖放到窗体即可。 ### 4. 切换主题 ```csharp // 设置全局主题 ELEStyles.SetStyle(ELEStyle.Blue); // 内置主题 ELEStyles.SetStyle(ELEStyle.Dark); // 暗色主题 // 可选主题: Blue, Green, Red, Orange, Purple, Dark, Gray, // Cyan, Pink, Brown, Black, White ``` --- ## 项目结构 ``` src/ELEControls/ ├── Core/ # 核心基础 │ ├── ELEControl.cs # 主基类 (继承 Control) │ ├── ELEUserControl.cs # 复合基类 (继承 UserControl) │ ├── ELEEnums.cs # 枚举定义 │ ├── ELEGlobal.cs # 全局常量 │ └── IELEStyle.cs # 主题接口 ├── Style/ # 主题样式 │ ├── ELEColor.cs # 颜色常量 │ ├── ELEBaseStyle.cs # 基础样式 (150+ 虚属性) │ ├── ELEStyleColor.cs # 12 套主题实现 │ ├── ELEStyles.cs # 全局主题管理器 │ └── ELEDPIScale.cs # DPI 缩放 ├── Common/ # 公共工具 │ └── ELEGDI.cs # GDI+ 扩展方法 ├── Forms/ # 窗体 │ ├── ELEBaseForm.cs # 基础窗体 (自定义标题栏) │ ├── ELEForm.cs # 标准窗体 │ ├── ELEMessageForm.cs # 消息弹窗 │ ├── ELEDialog.cs # 对话框 │ └── ELEDrawer.cs # 抽屉面板 └── Controls/ # 控件 (按分类) ├── Basic/ # 基础控件 ├── Form/ # 表单控件 ├── Data/ # 数据展示 ├── Navigation/ # 导航控件 ├── Feedback/ # 反馈控件 ├── Layout/ # 布局容器 ├── Chart/ # 图表控件 └── Industrial/ # 工业控件 ``` --- ## 组件一览 ### 基础控件 (5) | 控件 | 类名 | 说明 | |------|------|------| | 按钮 | `ELEButton` | 支持 Primary/Success/Warning/Danger/Info 五种语义类型,Round/Circle 形状 | | 图片按钮 | `ELEImageButton` | 支持图标+文字组合按钮 | | 标签 | `ELELabel` | 主题化文本标签 | | 分割线 | `ELELine` | 水平/垂直分割线 | | 链接 | `ELELink` | 主题化超链接文本 | ### 表单控件 (29) | 控件 | 类名 | 说明 | |------|------|------| | 文本框 | `ELETextBox` | 带图标、清除按钮的输入框 | | 多行文本 | `ELETextArea` | 多行输入框,支持字数统计 | | 密码框 | `ELEPasswordBox` | 密码输入,支持显示/隐藏切换 | | 搜索框 | `ELESearchBox` | 带搜索图标和清除按钮 | | 数字文本框 | `ELENumericTextBox` | 支持格式验证的数字输入 | | 数字输入 | `ELEInputNumber` | 带 +/- 按钮的数字调节器 | | 复选框 | `ELECheckBox` | 主题化复选框 | | 复选框组 | `ELECheckBoxGroup` | 复选框组容器 | | 单选按钮 | `ELERadioButton` | 主题化单选按钮 | | 单选组 | `ELERadioGroup` | 单选按钮组容器 | | 开关 | `ELESwitch` | 滑动开关,支持自定义文字 | | 下拉框 | `ELEComboBox` | 主题化下拉选择框 | | 级联选择 | `ELECascader` | 多级联动选择器 | | 树选择 | `ELETreeSelect` | 下拉树形选择器 | | 日期选择 | `ELEDatePicker` | 日期选择器,带日历弹窗 | | 时间选择 | `ELETimePicker` | 时间选择器 | | 滑块 | `ELETrackBar` | 基础滑块 | | 高级滑块 | `ELESlider` | 带刻度标记的滑块 | | 范围滑块 | `ELERangeSlider` | 双滑块范围选择 | | 评分 | `ELERate` | 星级评分 | | 颜色选择 | `ELEColorPicker` | 颜色选择器 | | 色轮 | `ELEColorWheel` | HSV 色轮选色器 | | 文件上传 | `ELEUpload` | 文件上传,支持拖放 | | 自动补全 | `ELEAutoComplete` | 输入自动补全建议 | | 标签输入 | `ELETagInput` | 标签式多值输入 | | 提及输入 | `ELEMention` | @提及输入框 | | 分段器 | `ELESegmented` | iOS 风格分段选择 | | 虚拟键盘 | `ELEKeyboard` | 数字/全键盘虚拟键盘 | | 富文本 | `ELERichTextBox` | 主题化富文本编辑器 | ### 数据展示控件 (29) | 控件 | 类名 | 说明 | |------|------|------| | 标签 | `ELETag` | 语义标签,支持 Light/Dark/Plain 效果 | | 徽章 | `ELEBadge` | 数字/圆点徽章 | | 头像 | `ELEAvatar` | 图片/文字头像 | | 卡片 | `ELECard` | 信息卡片容器 | | 数据表格 | `ELEDataGridView` | 主题化数据网格 | | 树视图 | `ELETreeView` | 主题化树形控件 | | 列表框 | `ELEListBox` | 主题化列表选择 | | 分页 | `ELEPagination` | 分页导航 | | 进度条 | `ELEProgressBar` | 线性进度条 | | 环形进度 | `ELECircleProgressBar` | 环形/仪表盘进度条 | | 滚动条 | `ELEScrollBar` | 主题化滚动条 | | 时间线 | `ELETimeline` | 垂直时间线 | | 描述列表 | `ELEDescriptions` | 键值对描述列表 | | 空状态 | `ELEEmpty` | 空数据占位提示 | | 结果页 | `ELEResult` | 操作结果反馈页 | | 统计值 | `ELEStatistic` | 数值统计展示 | | 水印 | `ELEWatermark` | 页面水印覆盖 | | 骨架屏 | `ELESkeleton` | 加载占位骨架 | | 折叠面板 | `ELECollapse` | 手风琴折叠面板 | | 穿梭框 | `ELETransfer` | 双列表穿梭选择 | | 日历 | `ELECalendar` | 月份日历视图 | | 图片 | `ELEImage` | 图片展示,支持 Fit 模式与预览 | | 走马灯 | `ELECarousel` | 轮播图,支持自动播放 | | 分割线 | `ELEDivider` | 带文字内容的分割线 | | 滚动文字 | `ELEScrollingText` | 跑马灯文字效果 | | 时钟 | `ELEClock` | 模拟时钟 | | 倒计时 | `ELECountDown` | 倒计时计时器 | | 无限滚动 | `ELEInfiniteScroll` | 滚动加载容器 | | 虚拟滚动 | `ELEVirtualScroll` | 大数据虚拟列表 | ### 导航控件 (13) | 控件 | 类名 | 说明 | |------|------|------| | 选项卡 | `ELETabControl` | 主题化选项卡 | | 面包屑 | `ELEBreadcrumb` | 面包屑导航 | | 导航菜单 | `ELENavMenu` | 侧边/顶部导航菜单 | | 下拉菜单 | `ELEDropdown` | 下拉菜单,支持分割按钮 | | 步骤条 | `ELESteps` | 步骤进度导航 | | 工具栏 | `ELEToolStrip` | 主题化工具栏 | | 菜单栏 | `ELEMenuStrip` | 主题化菜单栏 | | 状态栏 | `ELEStatusStrip` | 主题化状态栏 | | 右键菜单 | `ELEContextMenuStrip` | 主题化上下文菜单 | | 页头 | `ELEHeaderPanel` | 带返回按钮的页面头部 | | 回到顶部 | `ELEBackTop` | 浮动回到顶部按钮 | | 锚点导航 | `ELEAnchor` | 锚点定位导航 | | 小地图 | `ELEMiniMap` | 可滚动容器缩略导航 | ### 反馈控件 (7) | 控件 | 类名 | 说明 | |------|------|------| | 提示 | `ELEAlert` | 内联警告/提示条 | | 通知 | `ELENotification` | 桌面通知弹窗 (静态方法调用) | | 加载 | `ELELoading` | 全屏/局部加载遮罩 | | 消息条 | `ELEMessageBar` | 顶部消息提示条 | | 气泡提示 | `ELEPopover` | 气泡卡片弹出层 | | 文字提示 | `ELEToolTip` | 悬浮文字提示 | | 固钉 | `ELEAffix` | 元素固定定位 | ### 布局控件 (14) | 控件 | 类名 | 说明 | |------|------|------| | 面板 | `ELEPanel` | 基础面板容器 | | 标题面板 | `ELETitlePanel` | 带标题的面板 | | 分组框 | `ELEGroupBox` | 主题化分组框 | | 主框架 | `ELEMainFrame` | 侧栏+顶栏+内容区布局 | | 栅格行 | `ELERow` | 栅格系统行容器 | | 间距容器 | `ELESpace` | 自动间距布局 | | 布局容器 | `ELEContainer` | Element 风格布局容器 | | 页脚 | `ELEFooter` | 页面底部容器 | | 侧栏 | `ELEAside` | 可折叠侧边栏 | | 仪表盘 | `ELEDashboard` | 卡片网格仪表盘布局 | | 分割面板 | `ELESplitContainer` | 主题化分割面板 | | 流式布局 | `ELEFlowLayoutPanel` | 主题化流式布局 | | 表格布局 | `ELETableLayoutPanel` | 主题化表格布局 | | 分页容器 | `ELEPage` | 多页面切换容器 | ### 窗体 (5) | 控件 | 类名 | 说明 | |------|------|------| | 基础窗体 | `ELEBaseForm` | 自定义标题栏窗体基类 | | 标准窗体 | `ELEForm` | 通用主题窗体 | | 消息窗体 | `ELEMessageForm` | 消息弹窗 (替代 MessageBox) | | 对话框 | `ELEDialog` | 模态对话框 | | 抽屉 | `ELEDrawer` | 侧滑抽屉面板 | ### 图表控件 (8) | 控件 | 类名 | 说明 | |------|------|------| | 折线图 | `ELELineChart` | 多系列折线图,支持平滑曲线 | | 柱状图 | `ELEBarChart` | 多系列柱状图,支持堆叠 | | 饼图 | `ELEPieChart` | 饼图/环形图 | | 面积图 | `ELEAreaChart` | 面积填充图 | | 散点图 | `ELEScatterChart` | 散点图 | | 雷达图 | `ELERadarChart` | 雷达/蛛网图 | | 漏斗图 | `ELEFunnelChart` | 漏斗图 | | 甘特图 | `ELEGanttBar` | 甘特图,支持滚动 | ### 工业控件 (13) | 控件 | 类名 | 说明 | |------|------|------| | 仪表盘 | `ELEMeter` | 指针式仪表 | | 高级仪表 | `ELEGauge` | 多段彩色仪表 | | LED 标签 | `ELELedLabel` | LED 数码管显示 | | 管道 | `ELEPipe` | 工业管道,支持流向动画 | | 阀门 | `ELEValve` | 工业阀门,开/关状态 | | 温度计 | `ELEThermometer` | 温度计显示 | | 波形图 | `ELEWaveChart` | 实时波形/趋势图 | | 液位罐 | `ELETank` | 液位显示,带波纹动画 | | 风机 | `ELEFan` | 旋转风机,带叶片动画 | | 水泵 | `ELEPump` | 工业水泵,带叶轮动画 | | 设备块 | `ELEProcessDevice` | 工艺流程设备块 | | 信号灯 | `ELESignalLight` | 多色信号灯,支持闪烁 | | 电池 | `ELEBattery` | 电池电量显示 | --- ## 色彩体系 ELEControls 完整移植了 Element UI Plus 的语义色彩系统: | 语义 | 色值 | 用途 | |------|------|------| | Primary | `#409EFF` | 主操作、链接、选中态 | | Success | `#67C23A` | 成功状态、确认操作 | | Warning | `#E6A23C` | 警告信息、需要注意 | | Danger | `#F56C6C` | 危险操作、错误状态 | | Info | `#909399` | 辅助信息、次要文本 | 每个主色调自动生成 16 级渐变色阶(Light-1 到 Light-9、Dark-2),用于悬停、按下、禁用等状态。 --- ## 主题切换 ### 内置主题 ```csharp // 在应用启动时设置全局主题 ELEStyles.SetStyle(ELEStyle.Blue); ``` 支持 12 套主题:`Blue` `Green` `Red` `Orange` `Purple` `Dark` `Gray` `Cyan` `Pink` `Brown` `Black` `White` ### 自定义主题 继承 `ELEBaseStyle` 覆盖颜色属性即可创建自定义主题: ```csharp public class MyCustomStyle : ELEBaseStyle { public override Color PrimaryColor => ColorTranslator.FromHtml("#6366F1"); public override Color SuccessColor => ColorTranslator.FromHtml("#22C55E"); // 覆盖需要自定义的属性 (共 150+ 可覆盖属性) } // 应用自定义主题 ELEStyles.SetStyle(new MyCustomStyle()); ``` --- ## 渲染架构 所有控件采用**模板方法模式**渲染管线,继承自 `ELEControl` 或 `ELEUserControl`: ``` OnPaint ├── OnPaintFill() → 填充背景 ├── OnPaintRect() → 绘制边框 └── OnPaintFore() → 绘制前景内容 ``` 自定义控件只需继承基类并覆盖对应方法: ```csharp public class MyControl : ELEControl { protected override void OnPaintFill(Graphics g, GraphicsPath path) { // 自定义背景绘制 } protected override void OnPaintFore(Graphics g, GraphicsPath path) { // 自定义前景绘制 } } ``` ### 状态管理 控件自动管理以下交互状态,每种状态对应独立的颜色组(FillColor / RectColor / ForeColor): | 状态 | 说明 | |------|------| | Normal | 默认状态 | | Hover | 鼠标悬停 | | Press | 鼠标按下 | | Selected | 选中状态 | | Disabled | 禁用状态 | | ReadOnly | 只读状态 | | Focused | 获得焦点 | --- ## 枚举类型参考 ### ELEComponentType — 语义类型 ```csharp Default | Primary | Success | Warning | Danger | Info ``` ### ELEComponentSize — 组件尺寸 ```csharp Large (40px) | Default (32px) | Small (24px) ``` ### ELEButtonShape — 按钮形状 ```csharp Default | Round | Circle ``` ### ELEPlacement — 弹出位置 ```csharp Top | TopStart | TopEnd | Bottom | BottomStart | BottomEnd Left | LeftStart | LeftEnd | Right | RightStart | RightEnd ``` ### ELEDirection — 方向 ```csharp Up | Down | Left | Right ``` --- ## 使用示例 ### 主题按钮组 ```csharp var btnPrimary = new ELEButton { Text = "主要", Type = ELEComponentType.Primary }; var btnSuccess = new ELEButton { Text = "成功", Type = ELEComponentType.Success }; var btnWarning = new ELEButton { Text = "警告", Type = ELEComponentType.Warning }; var btnDanger = new ELEButton { Text = "危险", Type = ELEComponentType.Danger }; var btnInfo = new ELEButton { Text = "信息", Type = ELEComponentType.Info }; ``` ### 表单输入 ```csharp var txtName = new ELETextBox { PlaceholderText = "请输入姓名", Size = ELEComponentSize.Default, Width = 240 }; var cboCity = new ELEComboBox { PlaceholderText = "请选择城市", Size = ELEComponentSize.Default }; cboCity.Items.AddRange(new[] { "北京", "上海", "广州", "深圳" }); ``` ### 数据表格 ```csharp var grid = new ELEDataGridView { Dock = DockStyle.Fill, ShowCheckBoxes = true }; grid.Columns.Add("Name", "姓名"); grid.Columns.Add("Age", "年龄"); grid.Rows.Add("张三", 28); ``` ### 消息通知 ```csharp // 顶部消息条 ELEMessageBar.Show("操作成功!", ELEComponentType.Success); // 右下角通知 ELENotification.Show("系统通知", "您有新的消息,请及时查看。"); // 模态消息框 ELEMessageForm.Show("确定删除?", "提示", MessageBoxButtons.YesNo); ``` ### 图表 ```csharp var chart = new ELELineChart { Dock = DockStyle.Fill }; chart.Series.Add(new ELEChartSeries { Name = "销售额", Data = new List { 120, 200, 150, 80, 70, 110, 130 } }); chart.Categories = new List { "周一", "周二", "周三", "周四", "周五", "周六", "周日" }; ``` ### 工业控件 ```csharp // 仪表盘 var meter = new ELEMeter { Value = 75.5, MinValue = 0, MaxValue = 100, Unit = "℃" }; // 液位罐 var tank = new ELETank { Value = 65, MaxValue = 100, ShowWave = true }; // 阀门 var valve = new ELEValve { IsOpen = true, Direction = ELEDirection.Right }; ``` --- ## 构建 ```bash dotnet build src\ELEControls\ELEControls.csproj -c Release ``` 输出程序集位于: - `src\ELEControls\bin\Release\net8.0-windows\ELEControls.dll` (.NET 8.0) - `src\ELEControls\bin\Release\net48\ELEControls.dll` (.NET Framework 4.8) --- ## NuGet 包 本项目已发布到 NuGet,你可以直接通过 NuGet 包管理器安装: ### 安装方式 **Package Manager:** ```powershell Install-Package ELEControls ``` **.NET CLI:** ```bash dotnet add package ELEControls ``` **PackageReference:** ```xml ``` ### 发布 NuGet 包 如果你想自己构建和发布 NuGet 包,请参考 [NuGet 发布指南](./NUGET.md) 快速开始: ```powershell # 获取 API Key 后,一行命令完成发布 .\nuget-publish.ps1 -ApiKey "your-api-key" ``` --- ## 许可证 本项目基于 [木兰宽松许可证 第2版 (MulanPSL-2.0)](http://license.coscl.org.cn/MulanPSL2) 开源。