Browse Source

更新文档

pull/95/head
Sunny 10 months ago
parent
commit
9a3320c10f
  1. 32
      docs/.vitepress/config.mts
  2. 92
      docs/IniConfig.md
  3. 80
      docs/IniFile.md
  4. 29
      docs/Json.md
  5. 78
      docs/UIForm.md
  6. 78
      docs/UILoginForm.md
  7. 7
      docs/updates.md
  8. 20
      docs/updatesi.md

32
docs/.vitepress/config.mts

@ -19,6 +19,7 @@ export default defineConfig({
items: [
{ text: '项目说明', link: '/introduction' },
{ text: '更新日志', link: '/updates' },
{ text: '升级指南', link: '/updatesi' },
{ text: '常见问题', link: '/faq' },
{ text: '安装', link: '/install' },
{ text: '主题', link: '/theme' },
@ -28,12 +29,37 @@ 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' }
]
}
],
@ -48,8 +74,8 @@ export default defineConfig({
},
editLink: {
pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path',
text: '在 GitHub 上编辑此页面'
pattern: 'https://gitee.com/yhuse/SunnyUI/tree/master/docs/:path',
text: '在 Gitee 上编辑此页面'
},
docFooter: {

92
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<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)

80
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)

29
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<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)
~~~

78
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<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
新建窗体:
![输入图片说明](./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为扩展按钮点击的下拉菜单。

78
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<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设计,上面的某些控件是不让修改和移动的,所以有锁。
在使用时,父窗体一般都将其所用的控件的属性和事件进行了封装,可以正常使用。
举例:
![输入图片说明](./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";
}
```

7
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,6 +180,7 @@
\* 修改几个进度弹窗的关闭标志
\* 重构GDI一些方法
## 2023\-10\-27 V3.5.2
\+ **字体图标增加旋转角度参数SymbolRotate**
\* UINavBar: 修正下拉菜单文字显示垂直居中
@ -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属性

20
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显示圆角窗体,不需要可以关闭
Loading…
Cancel
Save