前言
在快速迭代的软件开发环境中,如何高效地开发一个功能完整、界面美观的 WinForm 管理系统,是许多开发者面临的现实问题。今天推荐一款基于 Ant Design 设计语言的 WinForm UI 框架,它通过深度封装和现代化设计,彻底改变了传统 WinForm 应用的开发模式。大家无需再为繁琐的基础设施代码所困扰,只需聚焦核心业务逻辑,能够用极简的方式快速搭建企业级桌面应用。
项目介绍
WenAntdUI 项目的主要模块及其对应的功能说明,涵盖了从示例测试到核心应用的各个组成部分,便于大家了解项目结构和功能分布。
项目结构具体如表所示:

内部运行集成:一行代码搞定一个完整的管理系统基础功能




项目功能
AOT发布:支持AOT(Ahead-of-Time)编译发布,提升应用性能。
字典管理:提供增删改查功能,方便管理系统中的各类字典数据。
用户管理:支持用户的增删改查、角色分配和密码重置。
菜单管理:实现菜单的增删改查,支持自定义页面控件和样式。
权限管理:精细的权限控制,确保系统的安全性。
用户设置:允许用户更改密码和修改图像,图像存储在SQL中。
项目说明
初次运行与登录
首次运行WenAntdUI时,它会自动初始化一个Sqlite数据库,并在运行目录下创建data.db文件。可以使用默认的登录账户admin和密码admin快速进入系统,开始体验各项功能。

集成启动方式
应用WenAntdUI,可以使用顶级语句:
            
            
              csharp
              
              
            
          
          App.Run(); // 只需要此代码即可启动一个项目
// services 主要是注入服务,将项目控件注入到服务中。
App.Run(services =>
{
    services.AddControlServices(Assembly.GetExecutingAssembly());
});
// AddControlServices 内部封装了Control注入功能,只需要传递程序集即可
            
            
              csharp
              
              
            
          
          // 很多开发项目,需要使用注册机功能,也只需要在 App.Run修改,即可拥有一个完整的注册机功能,硬件信息生成唯一注册码
App.Run(services =>
{
    services.AddControlServices(Assembly.GetExecutingAssembly());
}, true); // 此处增加参数加密解密
加密解密KEY请自行生成替换 Wen.Core.Helps AesRsaHelp 中的内容:
            
            
              csharp
              
              
            
          
          public static string RsaFromPem { get; set; } = @"-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxot7LoZAVHZDhlGE8e6/
WqTmgmGZhVepofQhhynB/jTA69lMXoKfcXJMr/8Zyfdug97re7NkJX8Jei4cJlEv
nyzNRrY1tz1+dkrISYi0nBkwaDMTd2Wsw63QjcqZl1yCTVT6jboNR/0a7hyb2gwt
5cXW2ylgVZ6PttOUPXb3ZF8oWLe1BVWfcQXFIlErqVjsY3iFgcNxCucvYhiDzcbm
qHFIbUj9760E666Ws3Io32OQK1EkkdufqNuL1gm9/9qYXE0KChGzetnFfhtOGmvK
cPp3os07zdeeFOdKbwCbZjUxSy2a/6IKvEWilONNPNSMBxcc70oci565CtrIdyah
IQIDAQAB
-----END PUBLIC KEY-----";
public static string AesKey = "u4GP+xHwd3slNDYCVeOvDpbe0eLJz7XpaEj46SA9EtM=";
public static string AesIv = "8Daxh29YSAjUBulFYoMhdw==";功能集成
内部集成了枚举、字典等样式识别,全局采用注入方式。Page控件可以使用注入方式,直接调用:
            
            
              csharp
              
              
            
          
          [Description("角色管理")] // 此处为菜单选择注释
public partial class SysRolePage : UserControl
{
    private readonly IFreeSql fsql;
    private readonly MenuService menuService;
    public SysRolePage(IFreeSql fsql, MenuService menuService)
    {
        this.fsql = fsql;
        this.menuService = menuService;
        InitializeComponent();
        this.adminTable1.SetColumns<SysRole>();
        this.adminTable1.Query();
        InitMenuItem();
        this.adminTable1.CellClick += AdminTable1_CellClick;
    }
}AdminTable
封装控件 AdminTable 只需要一行代码即可实现一个表的增删改查。

            
            
              csharp
              
              
            
          
          this.adminTable1.SetColumns<SysRole>();
[Index($"index_{nameof(SysRole)}_{nameof(RoleName)}", nameof(RoleName), true)]
public class SysRole
{
    /// <summary>
    /// 获得/设置 角色名称
    /// </summary>
    [DisplayName("角色名称")]
    [Col] // 自动编辑功能,需要在属性上面加上 Col 特性
    [Key]
    public string? RoleName { get; set; }
    /// <summary>
    /// 获得/设置 角色描述
    /// </summary>
    [DisplayName("角色描述")]
    [Col]
    public string? Description { get; set; }
}1、自定义构建列
            
            
              csharp
              
              
            
          
          this.adminTable1.SetColumn<SysMenuDto>()
    .Add(a => a.Name, 288, c => c.SetTree(nameof(SysMenuDto.Childs)))
    .Add(a => a.Code)
    .Add(a => a.ParentCode)
    .Add(a => a.OrderNo)
    .Add(a => a.IconImage)
    .Add(a => a.MenuType)
    .Add(a => a.Description)
    .Add(a => a.ControlType);2、查询数据
            
            
              csharp
              
              
            
          
          this.adminTable1.QueryData = async e =>
{
    e.IsExpand = true;
    return await fsql.Select<SysMenuDto>()
        .WhereIf(!string.IsNullOrWhiteSpace(e.QueryText), a => a.Name.Contains(e.QueryText))
        .ToTreeList();
};
this.adminTable1.Query(); // 手动执行查询
字典管理
支持增删改查操作。

菜单管理
支持增删改查、页面控件、自定义样式。开发中无需考虑 new,可以使用注入方式,在构造函数中使用:
            
            
              csharp
              
              
            
          
          public partial class UserControlTestTable : UserControl
{
    public UserControlTestTable(IFreeSql fsq1)
    {
        InitializeComponent();
        adminTable1.SetColumns<SysDict>();
    }
}
// 需要提前注入,若是采用插件方式开发,此处可以调用外部插件直接注入dll文件
App.Run(services =>
{
    services.AddControlServices(Assembly.GetExecutingAssembly());
}, true);完成注入后即可在菜单中选中使用。


角色管理
支持增删改查及权限分配。

用户管理
支持增删改查、角色分配、密码重置。

用户信息设置
支持更改密码、修改图像,图像存储在SQL中。

封装组件演示
1、前后端分离增删改查
2、图像选择组件
3、字典选择组件
4、上传功能集成组件
5、下载功能集成组件
6、Model编辑组件
7、双向绑定
8、Auth组件(按钮权限)
注意:前后分离通用查询方式虽然方便,但出于安全考虑,不集成在 AdminTable。若需要使用,只要替换增删改查代码即可。
1、查询数据
需要提供类型、搜索内容、页码、单页数:
            
            
              csharp
              
              
            
          
          var client = new ApiClient();
var res = await client.GetListAsync(typeof(SysDict), "", true, 1, 5);
this.table1.DataSource = res.Data;2、更新数据
            
            
              csharp
              
              
            
          
          var client = new ApiClient();
var res = client.UpdateObject(item);
await RefreshDataAsync();3、删除数据
            
            
              csharp
              
              
            
          
          var client = new ApiClient();
var res = client.DeleteObject(item);
await RefreshDataAsync();4、插入数据
            
            
              csharp
              
              
            
          
          var client = new ApiClient();
var res = client.InsertObject(item);
await RefreshDataAsync();Model编辑组件
使用方式:
            
            
              csharp
              
              
            
          
          this.modelEditControl1.GetItemBuilder(value)
    .Add(a => a.Color)
    .Add(a => a.Name)
    .Add(a => a.CreateTime)
    .Add(a => a.Image)
    .Add(a => a.KK)
    .Add(a => a.Dict)
    .Add(a => a.KKd)
    .Add(a => a.Typ)
    .Add(a => a.TestEditControlTest, content: new TestEditControl())
    .Add(a => a.Check);更新数据:
            
            
              csharp
              
              
            
          
          this.modelEditControl1.Model = obj;Auth组件(按钮权限)
在设计页面拖入 Auth 控件,然后点击按钮,按钮上就会多一个权限属性。


AdminTable 增删改权限设置方法:
            
            
              csharp
              
              
            
          
          this.auth1.SetAuth(this.adminTable1, "useradmin");
// 菜单中请设置权限 useradmin:edit,useradmin:delete,useradmin:add
项目源码
Gitee :https://gitee.com/AntdUI/wen-antd-ui
总结
WenAntdUI框架基于AntdUI,集成了多种实用功能,通过简洁的集成方式和丰富的组件库,为开发者提供了一站式的管理后台开发解决方案。不管是初始化与登录、项目结构与启动、数据演示与配置,还是功能集成与组件使用,WenAntdUI都表现出了极高的易用性和灵活性。对于希望快速开发管理后台系统的团队来说,WenAntdUI无疑是一个值得尝试的选择。
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。
也可以加入微信公众号[DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
