预计阅读时间:7 分钟
WinForm 开发者最头疼的事之一,就是默认控件看起来像从 Windows XP 时代穿越过来的。SunnyUI 是一个国产开源 WinForm 控件库,提供了几十个风格统一的现代控件,直接替换原生控件就能让界面焕然一新。V3.9.7 版本近期发布,继续在细节和文档上打磨。
为什么选 SunnyUI 而不是自己画
自己用 GDI+ 重绘控件是一条路,但代价不小——每个控件都要处理鼠标状态、焦点、字体适配、高 DPI 缩放,工作量很快失控。SunnyUI 把这些脏活包了:
- 控件数量充足:按钮、输入框、下拉框、表格、图表、导航栏、进度条、开关、分页等超过 60 种,覆盖常见业务场景。
- 风格统一:所有控件遵循同一套配色和圆角规范,不用操心"这个按钮和那个面板风格不搭"。
- 主题切换:内置多套颜色主题,一行代码切换深色/浅色模式。
- 中文友好:文档、示例、注释都以中文为主,社区在 Gitee 活跃。
快速上手:从零搭建一个 SunnyUI 窗体
最直接的方式是通过 NuGet 安装。创建一个 WinForm 项目后,执行:
# 在项目目录下安装 SunnyUI
dotnet add package SunnyUI
或者用 Visual Studio 的 NuGet 包管理器搜索 SunnyUI 安装。
安装完成后,修改主窗体继承自 UIForm,这是最关键的一步:
using SunnyUI;
// 把默认的 Form 替换为 UIForm
public class MainForm : UIForm
{
public MainForm()
{
Text = "SunnyUI 示例";
Width = 800;
Height = 600;
// 添加一个带图标和样式的主按钮
UIBtnMain btnSave = new UIBtnMain
{
Text = "保存数据",
Location = new System.Drawing.Point(30, 30),
Size = new System.Drawing.Size(150, 40)
};
btnSave.Click += BtnSave_Click;
// 添加一个带搜索提示的输入框
UITextBox txtSearch = new UITextBox
{
Watermark = "输入关键词搜索...",
Location = new System.Drawing.Point(30, 90),
Size = new System.Drawing.Size(250, 35)
};
// 添加一个开关控件
UISwitch switchEnable = new UISwitch
{
Active = true,
Location = new System.Drawing.Point(30, 140),
Size = new System.Drawing.Size(70, 30)
};
// 添加分页控件
UIPager pager = new UIPager
{
Location = new System.Drawing.Point(30, 200),
PageSize = 20,
RecordCount = 200,
PageIndex = 1
};
pager.PageChanged += Pager_PageChanged;
Controls.AddRange(new Control[] { btnSave, txtSearch, switchEnable, pager });
}
private void BtnSave_Click(object sender, EventArgs e)
{
UIMessageBox.ShowSuccess("保存成功!");
}
private void Pager_PageChanged(object sender, EventArgs e)
{
var pager = sender as UIPager;
Console.WriteLine($"当前页: {pager.PageIndex}");
}
}
几个值得注意的点:
UIForm自带标题栏样式和侧边导航支持,不需要手动重绘窗口边框。UIBtnMain是主操作按钮,有强调色背景;次要操作用UIBtnMinor。UITextBox的Watermark属性直接支持水印提示文字,不用额外画。UIMessageBox替代原生MessageBox,风格与整体一致。
主题与配色:一行代码换肤
SunnyUI 内置了多套主题风格,切换方式简单粗暴:
// 在 UIForm 初始化后切换主题
// 可选值参考 SunnyUI.Enums.UIStyle 枚举
this.Style = UIStyle.Dark; // 深色主题
// this.Style = UIStyle.Blue; // 蓝色经典
// this.Style = UIStyle.Colorful; // 多彩风格
如果需要自定义品牌色,可以修改全局配色参数:
// 自定义主色调(十六进制 ARGB)
UIStyles.SetStyleColor(UIStyle.Blue, Color.FromArgb(0xFF, 0x2D, 0x8C, 0CF));
所有控件会自动跟随当前主题色渲染,不需要逐个控件设置。
V3.9.7 更新关注点
根据项目更新日志页面(Gitee Wiki),V3.9.7 的迭代集中在:
- 控件细节修复:若干控件在特定 DPI 和字体设置下的渲染偏差被修正。
- 文档完善:帮助文档持续补充,Wiki 页面覆盖了大部分控件的属性说明和用法示例。作者特别提到评论功能缺少查找能力,建议有问题直接提 Issue 或到博客留言,比在文档评论区更高效。
- NuGet 同步:包版本与源码版本保持一致,直接
dotnet add package SunnyUI即可拿到最新版。
完整更新日志在 Gitee Wiki 的"更新日志"页面,每次版本变更都有逐条记录。
选用建议与边界
SunnyUI 适合以下场景:
- 内部工具 / 管理后台:快速出界面,风格统一,不需要请设计师。
- 工控 / 设备上位机:WinForm 在工业领域仍是主流,SunnyUI 的表格、图表、分页控件直接可用。
- 中小型桌面应用:不想在 UI 渲染上投入太多精力时,它是性价比最高的选择。
需要注意的边界:
- 高定制化需求:如果你的界面需要大量非标准布局、动画、3D 渲染,WPF 或 Avalonia 的灵活性更高。
- 跨平台:SunnyUI 绑定 WinForm,只跑在 Windows 上。需要 Linux/macOS 支持时,看 Avalonia 或 MAUI。
- 版本兼容:SunnyUI 支持 .NET Framework 4.0+ 和 .NET 6/8,但部分新控件在高版本框架下表现更好,建议用 .NET 6 以上开发。
上手清单:
dotnet add package SunnyUI安装包。- 主窗体继承
UIForm,替换默认Form。 - 用
UIXxx系列控件替代原生控件,从按钮和输入框开始。 - 通过
this.Style = UIStyle.Dark选一个主题。 - 遇到问题查 Gitee Wiki,或直接提 Issue。