From 9a3320c10f357836e78cc30b38e9f69bdfc26cf7 Mon Sep 17 00:00:00 2001 From: Sunny Date: Sun, 22 Sep 2024 22:21:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vitepress/config.mts | 38 +++++++++++++--- docs/IniConfig.md | 92 ++++++++++++++++++++++++++++++++++++++ docs/IniFile.md | 80 +++++++++++++++++++++++++++++++++ docs/Json.md | 29 ++++++++++++ docs/UIForm.md | 78 ++++++++++++++++++++++++++++++++ docs/UILoginForm.md | 78 ++++++++++++++++++++++++++++++++ docs/updates.md | 9 ++-- docs/updatesi.md | 20 +++++++++ 8 files changed, 415 insertions(+), 9 deletions(-) create mode 100644 docs/IniConfig.md create mode 100644 docs/IniFile.md create mode 100644 docs/Json.md create mode 100644 docs/UIForm.md create mode 100644 docs/UILoginForm.md create mode 100644 docs/updatesi.md diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 487d682b..b0cfe57b 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -12,13 +12,14 @@ export default defineConfig({ { text: '源码', link: 'https://gitee.com/yhuse/SunnyUI'} ], - sidebar: [ + sidebar: [ { text: '简介', collapsed: false, items: [ { text: '项目说明', link: '/introduction' }, { text: '更新日志', link: '/updates' }, + { text: '升级指南', link: '/updatesi' }, { text: '常见问题', link: '/faq' }, { text: '安装', link: '/install' }, { text: '主题', link: '/theme' }, @@ -28,15 +29,40 @@ export default defineConfig({ }, { text: '多页面框架', - collapsed: false, + collapsed: true, items: [ { text: '快速开始', link: '/started' }, { text: 'DPI缩放自适应方案', link: '/dpi' }, { text: '全局字体设置', link: '/globalfont' } ] + }, + { + text: '窗体', + collapsed: true, + items: [ + { text: 'UIForm', link: '/UIForm' }, + { text: 'UILoginForm', link: '/UILoginForm' } + ] + }, + { + text: '控件', + collapsed: true, + items: [ + { text: 'UIForm', link: '/UIForm' }, + { text: 'UILoginForm', link: '/UILoginForm' } + ] + }, + { + text: '工具类库', + collapsed: true, + items: [ + { text: 'IniFile - Ini文件读写类', link: '/IniFile' }, + { text: 'IniConfig - ini配置文件类', link: '/IniConfig' }, + { text: 'Json - 简易的Json静态类', link: '/Json' } + ] } ], - + socialLinks: [ { icon: 'github', link: 'https://gitee.com/yhuse/SunnyUI' }, { icon: 'github', link: 'https://github.com/yhuse/SunnyUI' } @@ -47,9 +73,9 @@ export default defineConfig({ copyright: `版权所有 © 2012-${new Date().getFullYear()} SunnyUI.Net` }, - editLink: { - pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path', - text: '在 GitHub 上编辑此页面' + editLink: { + pattern: 'https://gitee.com/yhuse/SunnyUI/tree/master/docs/:path', + text: '在 Gitee 上编辑此页面' }, docFooter: { diff --git a/docs/IniConfig.md b/docs/IniConfig.md new file mode 100644 index 00000000..d5ef720a --- /dev/null +++ b/docs/IniConfig.md @@ -0,0 +1,92 @@ +# Ini配置文件类 + +--- + +看过 [IniFile - Ini文件读写类 ](/IniFile),应该基本了解Ini文件的定义和读写了。 + +- 写文件 +~~~ + IniFile ini = new IniFile("D:\\setup.ini"); + ini.Write("Setup", "Name", "Sunny"); + ini.Write("Setup", "Age", 18); + ini.UpdateFile(); +~~~ +- 读文件 +~~~ + IniFile ini = new IniFile("D:\\setup.ini"); + string name = ini.ReadString("Setup", "Name", ""); + int age = ini.ReadInt("Setup", "Age", 0); +~~~ + +可这样看起来似乎还是比较麻烦,得知道配置文件的位置,正确填写section,name的字符串值。 +有没有一个类,只要写了类的属性就可以直接用,而不需要关注读写。 +**IniConfig**就是这样的一个类,下面简单的介绍下IniConfig的用法。 + +- 原理 + 通过反射读取和设置类的属性的值,并通过ini格式文件进行存储。 + +- 示例 +有这样一个配置文件,保存服务器的地址和端口,软件名称,以及软件中显示天气需要的城市名称。 +配置文件类代码如下: +~~~ + [ConfigFile("Config\\Setting.ini")] + public class Setting : IniConfig + { + [ConfigSection("Hello")] + public string SoftName { get; set; } + + public string ServerIP { get; set; } + + public int ServerPort { get; set; } + + public string City { get; set; } + + public override void SetDefault() + { + base.SetDefault(); + SoftName = "XX软件"; + ServerIP = "192.168.1.2"; + ServerPort = 9090; + City = "南京"; + } + } +~~~ +[ConfigFile("Config\\Setting.ini")] +配置ini文件的位置,当前程序目录下Config目录下的Setting.ini。 +*目录不存在时会自动创建目录 + +[ConfigSection("Hello")] +设置SoftName所在的节点Section的名称,如果不设置则默认为Setup + +public override void SetDefault() +当第一次运行时配置文件不存在时,设置配置的默认值,并保存至文件。 + +- 读取 +读取系统配置,并开始应用: +~~~ + Setting.Current.Load(); + + TcpClient client = new TcpClient(); + client.Connect(Setting.Current.ServerIP, Setting.Current.ServerPort); +~~~ +Setting.Current.Load(); +读取配置信息,将配置文件Setting.ini里的值读取到类的属性中。 +这样Setting.Current.ServerIP和Setting.Current.ServerPort就可以直接用了。 +如果需要修改配置,修改Setting.ini,重新读取就可以了。 +**注意:配置读取,属性的应用,都是用的Setting.Current,而不是Setting** + +- 保存 +系统修改配置,并保存到配置文件。 +例如系统中修改了获取天气的城市为重庆: +~~~ + Setting.Current.City = "重庆"; + Setting.Current.Save(); +~~~ +修改Setting.Current的属性,并通过Setting.Current.Save()保存即可。 + +- 其他 +通过IniConfig配置文件的应用,屏蔽ini文件常用的通过section,name的字符串值来获取参数的繁琐过程。 +1、建议读写的ini文件为IniConfig存储的文件。以免造成文件编码不统一。即先生成这个文件,再进行修改,而不是手动创建配置文件。 +2、配置读取,保存类的应用,都是用的Setting.Current,而不是Setting。 +3、支持的属性类型见[IniFile - Ini文件读写类 ](/IniFile) + diff --git a/docs/IniFile.md b/docs/IniFile.md new file mode 100644 index 00000000..ee539bf5 --- /dev/null +++ b/docs/IniFile.md @@ -0,0 +1,80 @@ +# Ini文件读写类 +--- +- **IniFile** + Ini文件读写类,基类为IniBase,已经处理过中文读写。 + **建议读写的ini文件为IniFile存储的文件。以免造成文件编码不统一。** + +- Ini文件格式 + 程序没有任何配置文件,那么它对外是全封闭的,一旦程序需要修改一些参数必须要修改程序代码本身并重新编译,为了让程序出厂后还能根据需要进行必要的配置,所以要用配置文件;配置文件有很多种,如INI配置文件,XML配置文件,cfg配置文件,还有就是可以使用系统注册表等。 + INI ”就是英文 “initialization”的头三个字母的缩写;当然INI file的后缀名也不一定是".ini"也可以是".cfg",".conf ”或者是".txt"。 + INI文件的格式很简单,最基本的三个要素是:parameters,sections和comments。 + + 什么是parameters? + INI所包含的最基本的“元素”就是parameter;每一个parameter都有一个name和一个value,如下所示: + name = value + + 什么是sections? + 所有的parameters都是以sections为单位结合在一起的。所有的section名称都是独占一行,并且sections名字都被方括号包围着([ and ])。在section声明后的所有parameters都是属于该section。对于一个section没有明显的结束标志符,一个section的开始就是上一个section的结束,或者是end of the file。Sections一般情况下不能被nested,当然特殊情况下也可以实现sections的嵌套。 + section如下所示: + [section] + + 什么是comments? + 在INI文件中注释语句是以分号“;”开始的。所有的所有的注释语句不管多长都是独占一行直到结束的。在分号和行结束符之间的所有内容都是被忽略的。 + 注释实例如下: + ;comments text + +- IniFile类支持的数据类型 + Windows API(WritePrivateProfileString)支持的类型为string类型,通过类型转换扩展了以下类型: + bool,byte,byte[],char,Color,Datetime,decimal,double,float,int, + long,Point,PointF,sbyte,short,Size,SizeF,uint,ulong,ushort, + Struct* + +- 写文件 +~~~ + IniFile ini = new IniFile("D:\\setup.ini"); + ini.Write("Setup", "Name", "Sunny"); + ini.Write("Setup", "Age", 18); + ini.UpdateFile(); +~~~ + ini配置文件被写到D:\setup.ini + **注意,ini文件名必须是完全路径,不能是相对路径** + 如果需要在程序可执行目录下生成ini文件,可用以下方法: +~~~ + IniFile ini = new IniFile(DirEx.CurrentDir() + "Setup.ini"); +~~~ + 打开此文件 +~~~ +; +[Setup] +Name=Sunny +Age=18 +~~~ + 注意,如果写的文件在C盘,系统为win7以上,请确保所运行的程序有相应的权限可以在C盘文件夹写文件。 + Write函数主要包括三个参数,分别对应Ini格式的section,name,value + +- 读文件 +~~~ + IniFile ini = new IniFile("D:\\setup.ini"); + string name = ini.ReadString("Setup", "Name", ""); + int age = ini.ReadInt("Setup", "Age", 0); +~~~ + Read函数主要包括三个参数,分别对应Ini格式的section,name,Default(如配置文件有值则从配置文件取值,如没有取Default值) + +- 其他函数 + 获取指定的Section名称中的所有Key + public string[] GetKeys(string section) + + 从Ini文件中,读取所有的Sections的名称 + public string[] Sections + + 读取指定的Section的所有Value到列表中 + public void GetSectionValues(string section, NameValueCollection values) + + 清除某个Section + public void EraseSection(string section) + + 删除某个Section下的键 + public void DeleteKey(string section, string key) + + 检查某个Section下的某个键值是否存在 + public bool KeyExists(string section, string key) \ No newline at end of file diff --git a/docs/Json.md b/docs/Json.md new file mode 100644 index 00000000..7625c9e6 --- /dev/null +++ b/docs/Json.md @@ -0,0 +1,29 @@ +# Json - 简易的Json静态类 +--- +- **Json** + 简易的Json静态类库,可以在不引用NewtonJson即可简单处理Json对象。 + 当然如果有复杂需求,第三方库还是推荐NewtonJson。 + 另外在Net5,System.Text.Json的性能已经非常不错了,也可以尝试。 + +- 原理 + NetFramework:调用System.Web.Script.Serialization命名空间下的JavaScriptSerializer + NetCore:调用System.Text.Json.JsonSerializer + +- 函数 + ~~~ + //将指定的Json字符串input转换为T类型的对象 + public static T Deserialize(string input) + + //将对象obj转换为Json字符串 + public static string Serialize(object obj) + + //从文件读取字符串转换为T类型的对象 + public static T DeserializeFromFile(string filename, Encoding encoding) + + //将对象obj转换为Json字符串,并保存到文件 + public static string SerializeToFile(object obj, string filename, Encoding encoding) + ~~~ + + + + diff --git a/docs/UIForm.md b/docs/UIForm.md new file mode 100644 index 00000000..c9cfb9b9 --- /dev/null +++ b/docs/UIForm.md @@ -0,0 +1,78 @@ +# UIForm +--- +- **UIForm** +常用的窗体基类。 + +- 默认属性:Text +- 默认事件:Load +- 属性列表 + +| 属性 | 说明 | 类型 | 默认值 | +|-----------|--------|--------|-------| +| Style | 主题样式 | UIStyle | Blue | +| StyleCustomMode | 获取或设置可以自定义主题风格 | bool | false | +| Text |获取或设置显示的文本 | string | - | +| TextAlignment| 文字对齐方式 | StringAlignment| - | +| AllowAddControlOnTitle| 允许在标题栏放置控件 | bool | false | +| AllowShowTitle| 允许显示标题栏 | bool | true | +| ShowIcon | 是否显示窗体的标题栏图标 | bool | true | +| TitleHeight | 标题栏高度 | int | 35 | +| TitleColor | 标题栏颜色 | Color | - | +| TitleForeColor | 标题前景色(标题颜色) | Color | - | +| ExtendBox | 显示扩展按钮 | bool | false | +| ExtendSymbol | 扩展按钮字体图标 | int | 0 | +| ExtendSymbolSize | 扩展按钮字体图标大小 | int | 24 | +| ExtendSymbolOffset | 扩展按钮字体图标偏移量 | Point | 0, 0 | +| ExtendMenu | 扩展按钮菜单 | UIContextMenuStrip | - | +| ControlBox | 是否显示窗体的控制按钮 | bool | true | +| MaximizeBox | 是否显示窗体的最大化按钮 | bool | true | +| MinimizeBox | 是否显示窗体的最小化按钮 | bool | true | +| RectColor | 边框颜色 | Color | - | +| ForeColor | 字体颜色 | Color | - | +| StickyBorderTime| 设置或获取在显示器边缘停留的最大时间(ms) | long | 500 | +| IsForbidAltF4 | 是否屏蔽Alt+F4 | bool | false | +| EscClose| 使用Esc键关闭窗口 | bool | false | +| CloseAskString| 关闭时提示文字 | string | | +| ShowFullScreen| 是否以全屏模式进入最大化 | bool | false | +| ShowRadius| 是否显示圆角 | bool | true| +| ShowRect| 是否显示边框 | bool | true| +| ShowTitleIcon | 显示标题栏图标 | bool | false | +| ShowDragStretch| 显示边框可拖拽调整窗体大小 | bool | false | +| ShowShadow| 是否显示阴影 | bool | false | +| Version | 版本 | string | - | +| TagString | 获取或设置包含有关控件的数据的对象字符串 | string | - | + +- 主题风格 + 主题 https://gitee.com/yhuse/SunnyUI/wikis/pages?sort_id=3739705&doc_id=1022550
+ +- 主题设置 + 设置Style属性调用系统自带主题,如果需要自定义颜色,就是更改颜色属性后,把控件的Style设置为Custom,StyleCustomMode设置为True + StyleCustomMode就是接受用户自定义颜色的意思。 + +- 创建窗体 + 项目引用SunnyUI.dll和SunnyUI.Common.dll,或者从Nuget引用SunnyUI。 + 详见安装:https://gitee.com/yhuse/SunnyUI/wikis/pages?sort_id=3742036&doc_id=1022550 + 新建窗体: + ![输入图片说明](./assets/225716_b52454e1_416720.png) + + 修改:把Form修改成UIForm,并且 using Sunny.UI; + ![输入图片说明](./assets/225813_5afb8ba9_416720.png) + + 这时切换到窗体,窗体已经变为UIForm: + ![输入图片说明](./assets/28063ee9_416720.png) + + **下一步的操作非常重要:** + 把窗体的AutoScaleMode从Font设置为None,否则可能出现因为屏幕分辨率而导致的窗体变形。 + ![输入图片说明](./assets/230113_bf629fd4_416720.png) + + + +- 拖拽调整窗体大小 + ShowDragStretch 设置为true,显示边框可拖拽调整窗体大小。 + +- 显示任务栏图标 + 设置Icon,将ShowIcon设置为true,再打开ShowTitleIcon可显示窗体标题栏图标。 + +- 显示标题栏扩展按钮 + ExtendBox设置为true,可在标题栏现有按钮最小化按钮的左边显示一个扩展按钮。 + 扩展按钮的图标设置ExtendSymbol。ExtendMenu为扩展按钮点击的下拉菜单。 diff --git a/docs/UILoginForm.md b/docs/UILoginForm.md new file mode 100644 index 00000000..f7db400c --- /dev/null +++ b/docs/UILoginForm.md @@ -0,0 +1,78 @@ +# UILoginForm +--- +- **UILoginForm** +登录窗体基类。 + +- 默认属性:Text +- 默认事件:OnLogin +- 属性列表 + +| 属性 | 说明 | 类型 | 默认值 | +|-----------|--------|--------|-------| +| Style | 主题样式 | UIStyle | Blue | +| StyleCustomMode | 获取或设置可以自定义主题风格 | bool | false | +| Title | 顶部标题 | string | - | +| SubText | 底部文字描述 | string | - | +| LoginImage | 背景图片 | UILoginImage | - | +| UserName | 用户名 | string | -| +| Password | 密码 | string | -| +| IsLogin | 登录是否成功| bool | -| +| Version | 版本 | string | - | +| TagString | 获取或设置包含有关控件的数据的对象字符串 | string | - | + +- 事件 + ButtonLoginClick:确定按钮点击事件,有此事件时不执行OnLogin。需要手动给IsLogin赋值。 + ButtonCancelClick:取消按钮点击事件。 + OnLogin:登录事件。ButtonLoginClick为空时才执行此时间,返回值为IsLogin。 + +- 主题风格 + 主题 https://gitee.com/yhuse/SunnyUI/wikis/pages?sort_id=3739705&doc_id=1022550
+ +- 主题设置 + 设置Style属性调用系统自带主题,如果需要自定义颜色,就是更改颜色属性后,把控件的Style设置为Custom,StyleCustomMode设置为True + StyleCustomMode就是接受用户自定义颜色的意思。 + +- 创建窗体 + 项目引用SunnyUI.dll和SunnyUI.Common.dll,或者从Nuget引用SunnyUI。 + 详见安装:https://gitee.com/yhuse/SunnyUI/wikis/pages?sort_id=3742036&doc_id=1022550 + 创建窗体:参考UIForm创建窗体 https://gitee.com/yhuse/SunnyUI/wikis/pages?sort_id=4098716&doc_id=1022550 + 切记把窗体的AutoScaleMode从Font设置为None,否则可能出现因为屏幕分辨率而导致的窗体变形。 + +- 为什么继承的窗体,上面有小锁,能解开吗,还有就是继承的窗体,有些控件属性都设置不了,怎么办? + 首先得了解窗体继承的概念,和类的继承是差不多的,窗体上有小锁的其实就是类似于类继承中父类的某个Private属性 + 为了保证继承窗体的UI设计,上面的某些控件是不让修改和移动的,所以有锁。 + 在使用时,父窗体一般都将其所用的控件的属性和事件进行了封装,可以正常使用。 + 举例: + ![输入图片说明](./assets/011a9a81_416720.png) + +- 继承的登录窗体的登录按钮有锁,但其点击事件已封装到父类的事件。 + 需要选中窗体,查看其事件: + ![输入图片说明](./assets/105850_f7800c4b_416720.png) + + + +- 通过代码创建 + 也可以不用创建窗体,直接通过代码创建,来实现登录过程 +```c# + UILoginForm frm = new UILoginForm(); + frm.ShowInTaskbar = true; + frm.Text = "Login"; + frm.Title = "SunnyUI.Net Login Form"; + frm.SubText = Version; + frm.OnLogin += Frm_OnLogin; + frm.LoginImage = UILoginForm.UILoginImage.Login2; + frm.ShowDialog(); + if (frm.IsLogin) + { + UIMessageTip.ShowOk("登录成功"); + } + + frm.Dispose(); +``` + 在Frm_OnLogin事件里通过与数据库比对或者调用接口判断登录是否成功。例如: +```c# + private bool Frm_OnLogin(string userName, string password) + { + return userName == "admin" && password == "admin"; + } +``` \ No newline at end of file diff --git a/docs/updates.md b/docs/updates.md index 1104d450..4f426c1e 100644 --- a/docs/updates.md +++ b/docs/updates.md @@ -156,6 +156,7 @@ \* UIRadioButton: 增加属性可修改图标大小 \* UIRadioButtonGroup: 增加属性可修改图标大小 + ## 2023\-11\-28 V3.6.1 \+ UISymbolPanel:增加图标编辑器面板 \* UIFontImages: 重写字体图标编辑器,优化打开速度 @@ -166,7 +167,7 @@ ## 2023\-11\-21 V3.6.0 **注意:大版本更新,重构主题** 建议新项目使用此版本,如果3.6.0以下版本需要升级参照文档比较差异: -[升级指南/3.5.2-->3.6.0](https://gitee.com/yhuse/SunnyUI/wikis/%E5%8D%87%E7%BA%A7%E6%8C%87%E5%8D%97/3.5.2--%3E3.6.0) +[升级指南/3.5.2-->3.6.0](/updatesi) \+ 增加.Net8支持 \- UIKnobControl: 删除UIKnobControl,源码见:[UIKnobControl.cs](https://gitee.com/yhuse/SunnyUI/blob/V3.5.2/SunnyUI/Controls/UIKnobControl.cs) \* 重构主题 @@ -179,8 +180,9 @@ \* 修改几个进度弹窗的关闭标志 \* 重构GDI一些方法 + ## 2023\-10\-27 V3.5.2 -\+ **字体图标增加旋转角度参数SymbolRotate** +\+ **字体图标增加旋转角度参数SymbolRotate** \* UINavBar: 修正下拉菜单文字显示垂直居中 \* UINavBar: ImageList为空时,下拉菜单增加Symbol绘制 \* UIContextMenuStrip: 修正文字显示垂直居中 @@ -194,6 +196,7 @@ \* UIDropControl: 修复在高DPI下,文字垂直不居中的问题 \* UIDropControl: 修复在某些字体不显示下划线的问题 + ## 2023\-10\-16 V3.5.1 \+ 增加.Net8支持 \+ 增加MaterialIcons字体图标 @@ -208,7 +211,7 @@ ## 2023\-09\-19 V3.5.0 **注意:大版本更新,SunnyUI字体改为系统默认字体(中文Windows常见字体为宋体)** 建议新项目使用此版本,如果3.5.0以下版本需要升级参照文档设置全局字体: -[https://gitee.com/yhuse/SunnyUI/wikis/多页面框架/全局字体设置](https://gitee.com/yhuse/SunnyUI/wikis/%E5%A4%9A%E9%A1%B5%E9%9D%A2%E6%A1%86%E6%9E%B6/%E5%85%A8%E5%B1%80%E5%AD%97%E4%BD%93%E8%AE%BE%E7%BD%AE) +[全局字体设置](/globalfont) \+ 重构全局字体设置逻辑,可以在运行时设置全局字体 \+ 增加全局矩形设计,忽略圆角,UIStyleManager的GlobalRectangle属性 diff --git a/docs/updatesi.md b/docs/updatesi.md new file mode 100644 index 00000000..235806d0 --- /dev/null +++ b/docs/updatesi.md @@ -0,0 +1,20 @@ +# 升级指南 +--- +## 3.5.2-->3.6.0 +- 本次升级对主题进行了重构,隐藏了修改自定义颜色时需要设置的StyleCustomMode属性。 + **不需要设置全局主题时** + 所有控件的颜色修改所见即所得,窗体关闭后再打开,所设置的颜色会保存。默认的主题为UIStyle.Inherited(继承的全局主题) + **需要设置全局主题时** + 不切换主题,和上面的设置一致,如需切换主题仍然保留控件用户自定义修改颜色,在修改完颜色后,将控件的主题设置为UIStyle.Custom(自定义) + 重构主要是方便了新手用户的使用体验。 + +- UICheckBoxGroup + 升级后原有的值变化事件 + private void uiCheckBoxGroup1_ValueChanged(object sender, int index, string text, bool isChecked) + 修改为: + private void uiCheckBoxGroup1_ValueChanged(object sender, CheckBoxGroupEventArgs e) + 按Demo示例操作修改即可。 + +- UIForm: 修改默认ShowShadow边框阴影打开,ShowRadius显示圆角关闭 +ShowShadow打开时,在Win11显示圆角窗体,不需要可以关闭 +