mirror of https://github.com/yhuse/SunnyUI.git

8 changed files with 415 additions and 9 deletions
-
32docs/.vitepress/config.mts
-
92docs/IniConfig.md
-
80docs/IniFile.md
-
29docs/Json.md
-
78docs/UIForm.md
-
78docs/UILoginForm.md
-
7docs/updates.md
-
20docs/updatesi.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<Setting> |
||||
|
{ |
||||
|
[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) |
||||
|
|
@ -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) |
@ -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<T>(string input) |
||||
|
|
||||
|
//将对象obj转换为Json字符串 |
||||
|
public static string Serialize(object obj) |
||||
|
|
||||
|
//从文件读取字符串转换为T类型的对象 |
||||
|
public static T DeserializeFromFile<T>(string filename, Encoding encoding) |
||||
|
|
||||
|
//将对象obj转换为Json字符串,并保存到文件 |
||||
|
public static string SerializeToFile(object obj, string filename, Encoding encoding) |
||||
|
~~~ |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
@ -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<br/> |
||||
|
|
||||
|
- 主题设置 |
||||
|
设置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 |
||||
|
新建窗体: |
||||
|
 |
||||
|
|
||||
|
修改:把Form修改成UIForm,并且 using Sunny.UI; |
||||
|
 |
||||
|
|
||||
|
这时切换到窗体,窗体已经变为UIForm: |
||||
|
 |
||||
|
|
||||
|
**下一步的操作非常重要:** |
||||
|
把窗体的AutoScaleMode从Font设置为None,否则可能出现因为屏幕分辨率而导致的窗体变形。 |
||||
|
 |
||||
|
|
||||
|
|
||||
|
|
||||
|
- 拖拽调整窗体大小 |
||||
|
ShowDragStretch 设置为true,显示边框可拖拽调整窗体大小。 |
||||
|
|
||||
|
- 显示任务栏图标 |
||||
|
设置Icon,将ShowIcon设置为true,再打开ShowTitleIcon可显示窗体标题栏图标。 |
||||
|
|
||||
|
- 显示标题栏扩展按钮 |
||||
|
ExtendBox设置为true,可在标题栏现有按钮最小化按钮的左边显示一个扩展按钮。 |
||||
|
扩展按钮的图标设置ExtendSymbol。ExtendMenu为扩展按钮点击的下拉菜单。 |
@ -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<br/> |
||||
|
|
||||
|
- 主题设置 |
||||
|
设置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设计,上面的某些控件是不让修改和移动的,所以有锁。 |
||||
|
在使用时,父窗体一般都将其所用的控件的属性和事件进行了封装,可以正常使用。 |
||||
|
举例: |
||||
|
 |
||||
|
|
||||
|
- 继承的登录窗体的登录按钮有锁,但其点击事件已封装到父类的事件。 |
||||
|
需要选中窗体,查看其事件: |
||||
|
 |
||||
|
|
||||
|
|
||||
|
|
||||
|
- 通过代码创建 |
||||
|
也可以不用创建窗体,直接通过代码创建,来实现登录过程 |
||||
|
```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"; |
||||
|
} |
||||
|
``` |
@ -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显示圆角窗体,不需要可以关闭 |
||||
|
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue