V3.0.9 增加对.Net6的支持

This commit is contained in:
Sunny 2021-11-19 13:41:26 +08:00
parent 88d608a946
commit 49b87913da
14 changed files with 332 additions and 1086 deletions

1
.gitignore vendored
View File

@ -342,3 +342,4 @@ ASALocalRun/
healthchecksdb
/SunnyUI.Net5.Demo/bin/net5.0-windows
/Bin/net472
/Bin/net6.0-windows

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.0.8.0")]
[assembly: AssemblyFileVersion("3.0.8.0")]
[assembly: AssemblyVersion("3.0.9.0")]
[assembly: AssemblyFileVersion("3.0.9.0")]

View File

@ -38,12 +38,12 @@
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<ItemGroup>
<Reference Include="SunnyUI, Version=3.0.8.0, Culture=neutral, processorArchitecture=MSIL">
<Reference Include="SunnyUI, Version=3.0.9.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\Bin\net40\SunnyUI.dll</HintPath>
</Reference>
<Reference Include="SunnyUI.Common, Version=3.0.8.0, Culture=neutral, PublicKeyToken=5a271fb7ba597231, processorArchitecture=MSIL">
<HintPath>..\packages\SunnyUI.Common.3.0.8\lib\net40\SunnyUI.Common.dll</HintPath>
<Reference Include="SunnyUI.Common, Version=3.0.9.0, Culture=neutral, PublicKeyToken=5a271fb7ba597231, processorArchitecture=MSIL">
<HintPath>..\packages\SunnyUI.Common.3.0.9\lib\net40\SunnyUI.Common.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="SunnyUI.Common" version="3.0.8" targetFramework="net40" />
<package id="SunnyUI.Common" version="3.0.9" targetFramework="net40" />
</packages>

View File

@ -6,9 +6,9 @@
<UseWindowsForms>true</UseWindowsForms>
<RootNamespace>Sunny.UI.Demo</RootNamespace>
<ApplicationIcon>SunnyUI.ico</ApplicationIcon>
<AssemblyVersion>3.0.8.0</AssemblyVersion>
<FileVersion>3.0.8.0</FileVersion>
<Version>3.0.8</Version>
<AssemblyVersion>3.0.9.0</AssemblyVersion>
<FileVersion>3.0.9.0</FileVersion>
<Version>3.0.9</Version>
<Authors>SunnyUI</Authors>
<Company>SunnyUI.Net</Company>
<Copyright>Copyright ©SunnyUI.Net 2012-2021</Copyright>
@ -25,7 +25,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="SunnyUI" Version="3.0.8" />
<PackageReference Include="SunnyUI" Version="3.0.9" />
</ItemGroup>
<ItemGroup>

View File

@ -19,6 +19,7 @@
* 2020-01-01: V2.2.0
******************************************************************************/
#pragma warning disable CA1416 // 验证平台兼容性
using System;
using System.Collections.Generic;
using System.Drawing;
@ -394,7 +395,9 @@ namespace Sunny.UI
/// <returns>Image</returns>
public static Image GetImageFromUrl(string url)
{
#pragma warning disable SYSLIB0014 // 类型或成员已过时
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(new Uri(url));
#pragma warning restore SYSLIB0014 // 类型或成员已过时
req.Method = "GET";
req.UserAgent = " Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko";
req.ContentType = "application/x-www-form-urlencoded";

View File

@ -1,788 +0,0 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2021 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.dll can be used for free under the GPL-3.0 license.
* If you use this code, please keep this note.
* 使
******************************************************************************
* : UIniFileEx.cs
* : INI WinAPI
* : V3.0
* : 2021-10-27
*
* 2021-10-27: V2.2.0
******************************************************************************/
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
namespace Sunny.UI
{
public class IniFileEx
{
private readonly Dictionary<string, NameValueCollection> data = new();
private static readonly Regex regRemoveEmptyLines =
new Regex
(
@"(\s*;[\d\D]*?\r?\n)+|\r?\n(\s*\r?\n)*",
RegexOptions.Multiline | RegexOptions.Compiled
);
private static readonly Regex regParseIniData =
new Regex
(
@"
(?<IsSection>
^\s*\[(?<SectionName>[^\]]+)?\]\s*$
)
|
(?<IsKeyValue>
^\s*(?<Key>[^(\s*\=\s*)]+)?\s*\=\s*(?<Value>[\d\D]*)$
)",
RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace
);
public IniFileEx(string fileName) : this(fileName, Encoding.Default) { }
public IniFileEx(string fileName, Encoding encoding)
{
FileName = fileName;
Encoding = encoding;
using FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
ReadIniData(fs, encoding);
}
/// <summary>
/// 文件名
/// </summary>
[Description("文件名")]
public string FileName { get; set; } //INI文件名
public Encoding Encoding { get; set; }
private void ReadIniData(Stream stream, Encoding encoding)
{
string lastSection = string.Empty;
data.Add(lastSection, new NameValueCollection());
if (stream != null && encoding != null)
{
using StreamReader reader = new StreamReader(stream, encoding);
string iniData = reader.ReadToEnd();
iniData = regRemoveEmptyLines.Replace(iniData, "\n");
string[] lines = iniData.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string s in lines)
{
Match m = regParseIniData.Match(s);
if (m.Success)
{
if (m.Groups["IsSection"].Length > 0)
{
string sName = m.Groups["SectionName"].Value.ToLowerInvariant();
if (lastSection != sName)
{
lastSection = sName;
if (!data.ContainsKey(sName))
{
data.Add(sName, new NameValueCollection());
}
}
}
else if (m.Groups["IsKeyValue"].Length > 0)
{
data[lastSection].Add(m.Groups["Key"].Value, m.Groups["Value"].Value);
}
}
}
}
}
public NameValueCollection this[string section]
{
get
{
section = section.ToLowerInvariant();
if (!data.ContainsKey(section))
data.Add(section, new NameValueCollection());
return data[section];
}
}
public string this[string section, string key]
{
get => this[section][key];
set => this[section][key] = value;
}
public object this[string section, string key, Type t]
{
get
{
if (t == null || t == (Type)Type.Missing)
return this[section][key];
return GetValue(section, key, null, t);
}
set
{
if (t == null || t == (Type)Type.Missing)
this[section][key] = String.Empty;
else
SetValue(section, key, value);
}
}
public string[] KeyNames(string section)
{
return this[section].AllKeys;
}
public string[] SectionValues(string section)
{
return this[section].GetValues(0);
}
private object GetValue(string section, string key, object defaultValue, Type t)
{
if (!data.ContainsKey(section)) return defaultValue;
string v = data[section][key];
if (string.IsNullOrEmpty(v)) return defaultValue;
TypeConverter conv = TypeDescriptor.GetConverter(t);
if (!conv.CanConvertFrom(typeof(string))) return defaultValue;
try
{
return conv.ConvertFrom(v);
}
catch
{
return defaultValue;
}
}
private T GetValue<T>(string section, string key, T defaultValue)
{
return (T)GetValue(section, key, defaultValue, typeof(T));
}
private void SetValue(string section, string key, object value)
{
if (value == null)
{
this[section][key] = string.Empty;
}
else
{
TypeConverter conv = TypeDescriptor.GetConverter(value);
if (!conv.CanConvertTo(typeof(string)))
{
this[section][key] = value.ToString();
}
else
{
this[section][key] = (string)conv.ConvertTo(value, typeof(string));
}
}
UpdateFile();
}
public void Write(string section, string key, string value)
{
SetValue(section, key, value);
}
public string Read(string section, string key, string Default)
{
return GetValue(section, key, Default);
}
/// <summary>
/// 读取指定的Section的所有Value到列表中
/// </summary>
/// <param name="section">section</param>
public NameValueCollection GetSectionValues(string section)
{
return this[section];
}
public void UpdateFile()
{
Save();
}
public void Save()
{
Save(FileName, Encoding);
}
public void Save(string fileName, Encoding encoding)
{
using FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
Save(fs, encoding);
}
private void Save(Stream stream, Encoding encoding)
{
using StreamWriter sw = new StreamWriter(stream, encoding);
foreach (var cur in data)
{
if (!string.IsNullOrEmpty(cur.Key))
{
sw.WriteLine("[{0}]", cur.Key);
}
NameValueCollection col = cur.Value;
foreach (string key in col.Keys)
{
if (!string.IsNullOrEmpty(key))
{
string value = col[key];
if (!string.IsNullOrEmpty(value))
sw.WriteLine("{0}={1}", key, value);
}
}
}
sw.Flush();
}
public bool HasSection(string section)
{
return data.ContainsKey(section.ToLowerInvariant());
}
public bool HasKey(string section, string key)
{
return
data.ContainsKey(section) &&
!string.IsNullOrEmpty(data[section][key]);
}
/// <summary>
/// 写结构
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
/// <typeparam name="T">T</typeparam>
public void WriteStruct<T>(string section, string key, T value) where T : struct
{
Write(section, key, value.StructToBytes());
}
/// <summary>
/// 读结构
/// </summary>
/// <typeparam name="T">T</typeparam>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public T ReadStruct<T>(string section, string key, T Default) where T : struct
{
//得到结构体的大小
int size = Default.Size();
byte[] bytes = Read(section, key, "").ToHexBytes();
return size > bytes.Length ? Default : bytes.ToStruct<T>();
}
/// <summary>
/// 写Byte数组
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, byte[] value)
{
Write(section, key, value.ToHexString());
}
/// <summary>
/// 读Byte数组
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public byte[] ReadBytes(string section, string key, byte[] Default)
{
return Read(section, key, Default.ToHexString()).ToHexBytes();
}
/// <summary>
/// 写Char
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, char value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读Char
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public char ReadChar(string section, string key, char Default = ' ')
{
return Read(section, key, Default.ToString()).ToChar(Default);
}
/// <summary>
/// 写Decimal
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, decimal value)
{
Write(section, key, value.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// 读Decimal
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public decimal ReadDecimal(string section, string key, decimal Default = 0)
{
return Read(section, key, Default.ToString(CultureInfo.InvariantCulture)).ToDecimal(Default);
}
/// <summary>
/// 写整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, short value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public short ReadShort(string section, string key, short Default = 0)
{
return Read(section, key, Default.ToString()).ToShort(Default);
}
/// <summary>
/// 写整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, ushort value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public ushort ReadUShort(string section, string key, ushort Default = 0)
{
return Read(section, key, Default.ToString()).ToUShort(Default);
}
/// <summary>
/// 写整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, int value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public int ReadInt(string section, string key, int Default = 0)
{
return Read(section, key, Default.ToString()).ToInt(Default);
}
/// <summary>
/// 写整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, uint value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public uint ReadUInt(string section, string key, uint Default = 0)
{
return Read(section, key, Default.ToString()).ToUInt(Default);
}
/// <summary>
/// 写整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, ulong value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public ulong ReadULong(string section, string key, ulong Default = 0)
{
return Read(section, key, Default.ToString()).ToULong(Default);
}
/// <summary>
/// 写整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, long value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public long ReadLong(string section, string key, long Default = 0)
{
return Read(section, key, Default.ToString()).ToLong(Default);
}
/// <summary>
/// 写布尔
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, bool value)
{
Write(section, key, value ? bool.TrueString : bool.FalseString);
}
/// <summary>
/// 读布尔
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public bool ReadBool(string section, string key, bool Default = false)
{
string str = Read(section, key, Default.ToString());
if (string.Equals(str, bool.TrueString, StringComparison.CurrentCultureIgnoreCase))
{
return true;
}
if (string.Equals(str, bool.FalseString, StringComparison.CurrentCultureIgnoreCase))
{
return false;
}
return Default;
}
/// <summary>
/// 写Double
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, double value)
{
Write(section, key, value.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// 读Double
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public double ReadDouble(string section, string key, double Default = 0)
{
return Read(section, key, Default.ToString(CultureInfo.InvariantCulture)).ToDouble(Default);
}
/// <summary>
/// 写Float
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, float value)
{
Write(section, key, value.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// 读Float
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public float ReadFloat(string section, string key, float Default = 0)
{
return Read(section, key, Default.ToString(CultureInfo.InvariantCulture)).ToFloat(Default);
}
/// <summary>
/// 写Byte
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, byte value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读Byte
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public byte ReadByte(string section, string key, byte Default = 0)
{
return Read(section, key, Default.ToString()).ToByte(Default);
}
/// <summary>
/// 写SByte
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, sbyte value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读Byte
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public sbyte ReadSByte(string section, string key, sbyte Default = 0)
{
return Read(section, key, Default.ToString()).ToSByte(Default);
}
/// <summary>
/// 写DateTime
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, DateTime value)
{
Write(section, key, value.ToString(DateTimeEx.DateTimeFormat));
}
/// <summary>
/// 读DateTime
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public DateTime ReadDateTime(string section, string key, DateTime Default)
{
string str = Read(section, key, Default.ToString(CultureInfo.InvariantCulture));
try
{
return str.ToDateTime(DateTimeEx.DateTimeFormat);
}
catch (Exception)
{
return Default;
}
}
/// <summary>
/// 写Point
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, Point value)
{
Write(section, key, ConvertEx.ObjectToString(value, typeof(Point)));
}
/// <summary>
/// 读Point
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public Point ReadPoint(string section, string key, Point Default)
{
string str = Read(section, key, "");
return (Point)ConvertEx.StringToObject(str, typeof(Point), Default);
}
/// <summary>
/// 写PointF
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, PointF value)
{
Write(section, key, ConvertEx.ObjectToString(value, typeof(PointF)));
}
/// <summary>
/// 读PointF
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public PointF ReadPointF(string section, string key, PointF Default)
{
string str = Read(section, key, "");
return (PointF)ConvertEx.StringToObject(str, typeof(PointF), Default);
}
/// <summary>
/// 写Size
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, Size value)
{
Write(section, key, ConvertEx.ObjectToString(value, typeof(Size)));
}
/// <summary>
/// 读Size
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public Size ReadSize(string section, string key, Size Default)
{
string str = Read(section, key, "");
return (Size)ConvertEx.StringToObject(str, typeof(Size), Default);
}
/// <summary>
/// 写SizeF
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, SizeF value)
{
Write(section, key, ConvertEx.ObjectToString(value, typeof(SizeF)));
}
/// <summary>
/// 读SizeF
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public SizeF ReadSizeF(string section, string key, SizeF Default)
{
string str = Read(section, key, "");
return (SizeF)ConvertEx.StringToObject(str, typeof(SizeF), Default);
}
/// <summary>
/// 写Color
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, Color value)
{
Write(section, key, ConvertEx.ObjectToString(value, typeof(Color)));
}
/// <summary>
/// 读Color
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public Color ReadColor(string section, string key, Color Default)
{
string str = Read(section, key, "");
return (Color)ConvertEx.StringToObject(str, typeof(Color), Default);
}
}
}

View File

@ -19,7 +19,7 @@ namespace Sunny.UI.Properties {
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
@ -200,7 +200,7 @@ namespace Sunny.UI.Properties {
}
/// <summary>
/// 查找类似 V3.0.8 的本地化字符串。
/// 查找类似 V3.0.9 的本地化字符串。
/// </summary>
internal static string Version {
get {

View File

@ -112,12 +112,12 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="close" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\close.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@ -156,14 +156,14 @@
</data>
<data name="Name" xml:space="preserve">
<value>SunnyUI.Net</value>
<comment>SunnyUI.Net 是基于.Net Framework 4.0+、.Net Core3.1、.Net 5 框架的 C# WinForm 开源控件库、工具类库、扩展类库、多页面开发框架。</comment>
<comment>SunnyUI.Net 是基于.Net Framework 4.0+、.Net 5 、.Net 6框架的 C# WinForm 开源控件库、工具类库、扩展类库、多页面开发框架。</comment>
</data>
<data name="notifier" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\notifier.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Version" xml:space="preserve">
<value>V3.0.8</value>
<comment>2021-10-01</comment>
<value>V3.0.9</value>
<comment>2021-11-19</comment>
</data>
<data name="wind" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\wind.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>

View File

@ -1,21 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net5.0-windows;netcoreapp3.1;net472;net40</TargetFrameworks>
<LangVersion>9.0</LangVersion>
<TargetFrameworks>net6.0-windows;net5.0-windows;net472;net40</TargetFrameworks>
<LangVersion>10.0</LangVersion>
<ProjectGuid>{AB1CB247-E20B-4CBE-B269-570ADDD96C53}</ProjectGuid>
<UseWindowsForms>true</UseWindowsForms>
<RootNamespace>Sunny.UI</RootNamespace>
<Description>SunnyUI.Net 是基于.Net Framework 4.0+、.Net Core3.1、.Net 5 框架的 C# WinForm 开源控件库、工具类库、扩展类库、多页面开发框架。</Description>
<Description>SunnyUI.Net 是基于.Net Framework 4.0+、.Net 5、.Net 6 框架的 C# WinForm 开源控件库、工具类库、扩展类库、多页面开发框架。</Description>
<Copyright>CopyRight © SunnyUI.Net 2012-2021</Copyright>
<PackageLicenseFile>LICENSE</PackageLicenseFile>
<Version>3.0.8</Version>
<Version>3.0.9</Version>
<Authors>ShenYonghua</Authors>
<Company>SunnyUI.Net</Company>
<PackageId>SunnyUI</PackageId>
<PackageProjectUrl>https://gitee.com/yhuse/SunnyUI</PackageProjectUrl>
<RepositoryUrl>https://gitee.com/yhuse/SunnyUI</RepositoryUrl>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PackageIcon>SunnyUI.png</PackageIcon>
</PropertyGroup>
@ -68,7 +67,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="SunnyUI.Common" Version="3.0.8" />
<PackageReference Include="SunnyUI.Common" Version="3.0.9" />
</ItemGroup>
<ItemGroup>

View File

@ -1,320 +1,351 @@
:fa-plus:增加; :fa-asterisk:修改; :fa-minus:删除
+ 增加;
* 修改;
- 删除
#### 2021-11-19 V3.0.9
+ SunnyUI: 增加.Net6版本的支持
+ UIStyle: 全部SunnyUI控件支持DPI自适应缩放
+ UISplitContainer: 增加UISplitContainer控件
+ IniFileEx: 增加INI文件读取类不用WinAPI
+ UIForm: 增加全局热键
+ UIForm: 增加IFrame接口
* UILabel: 增加文字旋转角度
* UIMessageForm: 多个按钮显示时增加FocusLine
* UIFlowLayoutPanel: 修改不同DPI缩放滚动条未覆盖的问题
* UIComboDataGridView: 增加过滤
* UIDataGridView: 增加一个可能出错的判断
* UIEditForm: 代码生成增加ComboCheckedListBox类型
* UIEditForm: 代码生成增加ComboTreeView类型
* UIFlowLayoutPanel: 增加Scroll事件
* UIRoundProcess: 增加显示小数位数
* UICombobox: 右侧边框不显示时,去除绘制线
* UILine: 调整最小长、宽为1
* UITextBox: 支持修改背景色
* UICheckBoxGroup :增加SetItemCheckState功能
* UITextBox: 调整最小高度限制
* UIProcessBar: 调整最小高度为3
* UILineChart: 修改图线显示超出范围的问题
* UITreeView: 判断节点Checked是否改变只有改变时才赋值
* UIListBox: 增加DrawItem和Demo
* UILineChart: 修改自定义最大值最小值为无穷时出错的问题
* UILineChart: 显示点的颜色支持自定义
* UILineChart: 支持数据包括Nan
#### 2021-10-01 V3.0.8
:fa-plus: Mapper: 轻量级的对象映射框架可以映射值类型包括Struct和以值类型构成的List和数组。
:fa-asterisk: UITreeView修复TreeView默认展开时绘制半选状态报错的问题
:fa-asterisk: UIDataGridViewFooter: 文字显示方向与Column列显示方向一致
:fa-asterisk: UICombobox: 修复使用BindingList进行绑定DisplayMember是空字符串显示错误
:fa-asterisk: UIStyle: 修改默认字体的GdiCharSet
:fa-asterisk: UIHeaderButton: 增加Disabled颜色
:fa-asterisk: UISwitch: 增加Disabled颜色
:fa-asterisk: UIForm: 增加Movable属性控制点击标题行是否能移动窗体
+ Mapper: 轻量级的对象映射框架可以映射值类型包括Struct和以值类型构成的List和数组。
* UITreeView: 修复TreeView默认展开时绘制半选状态报错的问题
* UIDataGridViewFooter: 文字显示方向与Column列显示方向一致
* UICombobox: 修复使用BindingList进行绑定DisplayMember是空字符串显示错误
* UIStyle: 修改默认字体的GdiCharSet
* UIHeaderButton: 增加Disabled颜色
* UISwitch: 增加Disabled颜色
* UIForm: 增加Movable属性控制点击标题行是否能移动窗体
#### 2021-09-08 V3.0.7
:fa-plus: MMFile: 增加多进程通信框架
:fa-plus: UIComboDataGridView: 增加表格下拉列表框
:fa-plus: UIMillisecondTimer: 增加毫秒定时器
:fa-plus: 增加ToolTip接口在用UIToolTip时解决类似UITextBox这类的组合控件无法显示ToolTip的问题
:fa-asterisk: UIForm: 修复多屏时最大化显示的问题
:fa-asterisk: UIPage: 修复OnLoad在加载时重复加载两次的问题
:fa-asterisk: UITextBox: 重写了水印文字的画法,并增加水印文字颜色
:fa-asterisk: UICombobox: 修改Watermark及其颜色
:fa-asterisk: UITextBox增加按钮
:fa-asterisk: UIPanel: 支持背景图片显示
:fa-asterisk: UITitlePanel: 增加标题文字颜色
:fa-asterisk: UIDropControl: 优化下拉框控件显示效果
:fa-asterisk: UIEditForm: 代码创建时增加UISwitch开关文字描述
:fa-asterisk: UINavMenu: 增加自定义TipsText显示的颜色
:fa-asterisk: UITreeView CheckBoxes增加三态感谢群友笑口常开
:fa-asterisk: UILineChart: 增加可只显示点的模式
:fa-asterisk: UICombobox: 增加ShowDropDown函数
:fa-asterisk: UIGroupBox: 解决Radius为0时的报错
:fa-asterisk: UIAnalogMeter: 增加ValueChanged事件
:fa-asterisk: Demo: 修改Demo的UITitlePage为UIPageUITitlePage已废弃
:fa-asterisk: UIForm, UIPage: 增加TitleFont属性
:fa-asterisk: UIProcessBar: 修改不显示百分比时,显示数值
:fa-asterisk: UIDatePicker: 增加可选择年、年月、年月日
:fa-asterisk: UIDateTimePicker: 选中的年月日标记显示
:fa-asterisk: UIImageButton: 更改了一个属性为私有在VB.Net下不区分大小写而出错
:fa-asterisk: UITabControl: 增加DisposeTabPageAfterRemove标志移除TabPage后是否自动销毁TabPage
:fa-asterisk: UITabControl: 关闭TabPage并销毁TabPage
:fa-asterisk: 整理了一些GDI绘图的常用方法扩展
:fa-asterisk: 整理了一些扩展函数
+ MMFile: 增加多进程通信框架
+ UIComboDataGridView: 增加表格下拉列表框
+ UIMillisecondTimer: 增加毫秒定时器
+ 增加ToolTip接口在用UIToolTip时解决类似UITextBox这类的组合控件无法显示ToolTip的问题
* UIForm: 修复多屏时最大化显示的问题
* UIPage: 修复OnLoad在加载时重复加载两次的问题
* UITextBox: 重写了水印文字的画法,并增加水印文字颜色
* UICombobox: 修改Watermark及其颜色
* UITextBox: 增加按钮
* UIPanel: 支持背景图片显示
* UITitlePanel: 增加标题文字颜色
* UIDropControl: 优化下拉框控件显示效果
* UIEditForm: 代码创建时增加UISwitch开关文字描述
* UINavMenu: 增加自定义TipsText显示的颜色
* UITreeView: CheckBoxes增加三态感谢群友: 笑口常开
* UILineChart: 增加可只显示点的模式
* UICombobox: 增加ShowDropDown函数
* UIGroupBox: 解决Radius为0时的报错
* UIAnalogMeter: 增加ValueChanged事件
* Demo: 修改Demo的UITitlePage为UIPageUITitlePage已废弃
* UIForm, UIPage: 增加TitleFont属性
* UIProcessBar: 修改不显示百分比时,显示数值
* UIDatePicker: 增加可选择年、年月、年月日
* UIDateTimePicker: 选中的年月日标记显示
* UIImageButton: 更改了一个属性为私有在VB.Net下不区分大小写而出错
* UITabControl: 增加DisposeTabPageAfterRemove标志移除TabPage后是否自动销毁TabPage
* UITabControl: 关闭TabPage并销毁TabPage
* 整理了一些GDI绘图的常用方法扩展
* 整理了一些扩展函数
#### 2021-08-12 V3.0.6
:fa-plus: UIPipe: 增加管道控件
:fa-plus: UIValve: 增加阀门控件
:fa-plus: UIStyle增加多彩主题,以颜色深色,文字白色为主
:fa-plus: UIStyle增加紫色主题
:fa-plus: UITableLayoutPanel增加控件
:fa-plus: Demo增加工控分类
:fa-plus: ITranslate增加多语翻译接口
:fa-plus: UGif: GIF图片解析类
:fa-plus: SunnyUI: Nuget项目引用增加签名
:fa-asterisk: UIFlowLayoutPanel: 增加了几个原生方法
:fa-asterisk: UITransfer: 增加了显示多个移动的属性
:fa-asterisk: UIProcessBar: 增加垂直方向的进度显示
:fa-asterisk: UILight: 默认不显示灯光亮线
:fa-asterisk: UINavMenu显示子节点提示箭头
:fa-asterisk: UINavBar: 增加选中项圆角
:fa-asterisk: UIImageListBox: 从文件载入图片,并且解除占用
:fa-asterisk: UICombobox: 增加几个原生方法
:fa-asterisk: UIListBox: 增加一大波ListBox原生方法
:fa-asterisk: UIListBox增加Items变更的事件
:fa-asterisk: UIForm: 修复最大化盖住任务栏的问题
:fa-asterisk: UITextBox: 增加GotFocus和LostFocus事件
:fa-asterisk: UIFlowLayoutPanel: 可像原生控件一样通过Controls.Add增加
:fa-asterisk: UIListBox: 选中项显示方角
:fa-asterisk: UIListBox增加多选行
:fa-asterisk: UIComboTreeView : 修复SelectedNode=null的问题
:fa-asterisk: UIRichTextBox: 修改滚动条没有文字时自动隐藏
:fa-asterisk: UIPage: 修复OnMouseMove事件
:fa-asterisk: UIStyle: 更新了放在TableLayoutPanel里控件的自定义颜色问题
:fa-asterisk: UILocalize: 内置支付串已经处理完国际化
:fa-asterisk: UILineChart可自定义背景色
:fa-asterisk: UILineChart增加实时数据的Demo
:fa-asterisk: UIBarChart, UIPieChart, UIDoughnutChart增加更新数据的方法
:fa-asterisk: UITreeView: 调整了显示CheckBoxes时图片位置
:fa-asterisk: ISymbol: 将字体图标最大尺寸从64调整到128
:fa-asterisk: UITextBox: 修改Focus可用
:fa-asterisk: UIButton增加ShowFocusColor用来显示Focus状态
:fa-asterisk: UIPage修复OnLoad在加载时重复加载两次的问题增加Final函数每次页面切换退出页面都会执行
:fa-asterisk: UIStyle: 多彩颜色增加随机颜色Demo
:fa-asterisk: UIScrollingText: 增加属性控制开启滚动
:fa-asterisk: UIPage恢复删除的Initialize事件
:fa-asterisk: ISytle调整主题切换执行流程
:fa-asterisk: IStyle支持自定义主题
:fa-asterisk: ISymbol增加SymbolOffset接口
:fa-asterisk: UITabControl支持Tab在下方显示
+ UIPipe: 增加管道控件
+ UIValve: 增加阀门控件
+ UIStyle: 增加多彩主题,以颜色深色,文字白色为主
+ UIStyle: 增加紫色主题
+ UITableLayoutPanel: 增加控件
+ Demo: 增加工控分类
+ ITranslate: 增加多语翻译接口
+ UGif: GIF图片解析类
+ SunnyUI: Nuget项目引用增加签名
* UIFlowLayoutPanel: 增加了几个原生方法
* UITransfer: 增加了显示多个移动的属性
* UIProcessBar: 增加垂直方向的进度显示
* UILight: 默认不显示灯光亮线
* UINavMenu: 显示子节点提示箭头
* UINavBar: 增加选中项圆角
* UIImageListBox: 从文件载入图片,并且解除占用
* UICombobox: 增加几个原生方法
* UIListBox: 增加一大波ListBox原生方法
* UIListBox: 增加Items变更的事件
* UIForm: 修复最大化盖住任务栏的问题
* UITextBox: 增加GotFocus和LostFocus事件
* UIFlowLayoutPanel: 可像原生控件一样通过Controls.Add增加
* UIListBox: 选中项显示方角
* UIListBox: 增加多选行
* UIComboTreeView : 修复SelectedNode=null的问题
* UIRichTextBox: 修改滚动条没有文字时自动隐藏
* UIPage: 修复OnMouseMove事件
* UIStyle: 更新了放在TableLayoutPanel里控件的自定义颜色问题
* UILocalize: 内置支付串已经处理完国际化
* UILineChart: 可自定义背景色
* UILineChart: 增加实时数据的Demo
* UIBarChart, UIPieChart, UIDoughnutChart增加更新数据的方法
* UITreeView: 调整了显示CheckBoxes时图片位置
* ISymbol: 将字体图标最大尺寸从64调整到128
* UITextBox: 修改Focus可用
* UIButton: 增加ShowFocusColor用来显示Focus状态
* UIPage: 修复OnLoad在加载时重复加载两次的问题增加Final函数每次页面切换退出页面都会执行
* UIStyle: 多彩颜色增加随机颜色Demo
* UIScrollingText: 增加属性控制开启滚动
* UIPage: 恢复删除的Initialize事件
* ISytle: 调整主题切换执行流程
* IStyle: 支持自定义主题
* ISymbol: 增加SymbolOffset接口
* UITabControl: 支持Tab在下方显示
#### 2021-07-11 V3.0.5
:fa-plus: 字体图标:增加FontAwesome V5.15版本字体图标
:fa-plus: UISignal: 增加信号强度显示控件
:fa-plus: UIToolStripDropDown: 增加了一个弹窗管理类
:fa-asterisk: UIPage增加标题行后期以替代UITitlePage
:fa-asterisk: Demo的Controls下的页面全部从UITitlePage切换到UIPage后期会逐步舍弃UITitlePage。
:fa-asterisk: UIDataGridView增加了一个RowHeight默认23
:fa-asterisk: IStyleInterface设置为Public可基于此扩展外部控件
:fa-asterisk: UIRichTextBox支持可改背景色
:fa-asterisk: UIPagination更新了Demo分页切换事件加载数据。
:fa-asterisk: UITitlePage解决标题栏闪烁
:fa-asterisk: UITextBox增加图标和字体图标的显示
:fa-asterisk: UITextBox: MaximumEnabledMinimumEnabled代替HasMaximumHasMinim
:fa-asterisk: UIHeaderButton: 增加了TextImageRelation实现文本和图像的相对位置
:fa-asterisk: UIListBox修改对象绑定的显示问题
:fa-asterisk: UICombobox: 更新了数据绑定相关代码
:fa-asterisk: UITabControlTab页标题选中高亮颜色增加可调整高度
:fa-asterisk: UINavBar: 标题选中高亮颜色增加可调整高度
:fa-asterisk: UIListBox更新一处数据绑定显示错误
:fa-asterisk: UINavMenu增加右侧图标
:fa-asterisk: UIBattery修改可自定义背景色
:fa-asterisk: UILight增加方形显示,优化渐变色
:fa-asterisk: UIHeaderButton增加ShowSelected是否显示选中状态
:fa-asterisk: UIBarChart修正一个显示的Bug
:fa-asterisk: UIRoundProcess修改显示值
:fa-asterisk: UIRichTextBox增加WordWrap属性
:fa-asterisk: UIDataGridView自定义单元格颜色
:fa-asterisk: IFame增加一个反馈的接口FeedbackPage可将对象反馈给Frame
:fa-asterisk: UIAvatar更改图片显示
:fa-asterisk: UIPagination设置总数在页面不超过总页数的情况下不刷新
:fa-asterisk: UITextBox等组合控件将其回调事件的Sender设置为this而不是其内置控件
:fa-asterisk: UIFlowLayoutPanel增加滚动条颜色属性
+ 字体图标: 增加FontAwesome V5.15版本字体图标
+ UISignal: 增加信号强度显示控件
+ UIToolStripDropDown: 增加了一个弹窗管理类
* UIPage: 增加标题行后期以替代UITitlePage
* Demo的Controls下的页面全部从UITitlePage切换到UIPage后期会逐步舍弃UITitlePage。
* UIDataGridView: 增加了一个RowHeight默认23
* IStyleInterface: 设置为Public可基于此扩展外部控件
* UIRichTextBox: 支持可改背景色
* UIPagination: 更新了Demo分页切换事件加载数据。
* UITitlePage: 解决标题栏闪烁
* UITextBox: 增加图标和字体图标的显示
* UITextBox: MaximumEnabledMinimumEnabled代替HasMaximumHasMinim
* UIHeaderButton: 增加了TextImageRelation实现文本和图像的相对位置
* UIListBox: 修改对象绑定的显示问题
* UICombobox: 更新了数据绑定相关代码
* UITabControl: Tab页标题选中高亮颜色增加可调整高度
* UINavBar: 标题选中高亮颜色增加可调整高度
* UIListBox: 更新一处数据绑定显示错误
* UINavMenu: 增加右侧图标
* UIBattery: 修改可自定义背景色
* UILight: 增加方形显示,优化渐变色
* UIHeaderButton: 增加ShowSelected是否显示选中状态
* UIBarChart: 修正一个显示的Bug
* UIRoundProcess: 修改显示值
* UIRichTextBox: 增加WordWrap属性
* UIDataGridView: 自定义单元格颜色
* IFame: 增加一个反馈的接口FeedbackPage可将对象反馈给Frame
* UIAvatar: 更改图片显示
* UIPagination: 设置总数在页面不超过总页数的情况下不刷新
* UITextBox等组合控件将其回调事件的Sender设置为this而不是其内置控件
* UIFlowLayoutPanel: 增加滚动条颜色属性
#### 2021-05-20 V3.0.4
:fa-plus: UIObjectCollection带集合个数改变事件的对象集合类
:fa-plus: UIStringCollection带集合个数改变事件的字符串集合类
:fa-plus: UIDataGridViewFooter增加DataGridView页脚可做统计显示
:fa-asterisk: UIBreadcrumb, UICheckBoxGroup, UIRadioButtonGroup: 更改列表项为UIObjectCollection
:fa-asterisk: UIScrollingText增加属性可设置双击暂停滚动
:fa-asterisk: UIEditForm动态生成表单,增加校验方法
:fa-asterisk: UIDoubleUpDown, UIIntegerUpDown将双击编辑更改为单机编辑并选中
:fa-asterisk: IFrame增加RemovePage接口
:fa-asterisk: UIMessageDialogUIMessageBox增加TopMost参数
:fa-asterisk: UIBarChart修改了一个显示负值的Bug
:fa-asterisk: UIForm加了个属性AllowAddControlOnTitle允许在标题栏放置控件
:fa-asterisk: UICombobox解决鼠标下拉选择触发SelectedIndexChanged两次的问题
:fa-asterisk: UISwitch更新Active状态改变时触发ValueChanged事件
:fa-asterisk: UIDataGridView设置数据行头部颜色
:fa-asterisk: UIEditForm代码生成增加Switch类型增加Combobox类型
:fa-asterisk: UICheckBoxUIRadioButton增加默认事件CheckedChanged
:fa-asterisk: UIProcessBar可设置显示进度条小数个数
:fa-asterisk: 等待提示框:更新等待时间短时无法关闭等待窗体的问题
:fa-asterisk: DirEx增加一个文件夹选择框
:fa-asterisk: UITextBox增加ShowScrollBar属性单独控制垂直滚动条
:fa-asterisk: UITextBox不限制高度为根据字体计算,可进行调整
:fa-asterisk: UITextBox解决多行输入时不能输入回车的问题
:fa-asterisk: UITextBox修改文字可以居中显示
:fa-asterisk: UIDatePicker,UIDateTimePicker增加ShowToday显示今日属性
:fa-asterisk: UILineChart有右键菜单时取消恢复上次缩放可在右键菜单增加节点调用ZoomBack()方法
+ UIObjectCollection: 带集合个数改变事件的对象集合类
+ UIStringCollection: 带集合个数改变事件的字符串集合类
+ UIDataGridViewFooter: 增加DataGridView页脚可做统计显示
* UIBreadcrumb, UICheckBoxGroup, UIRadioButtonGroup: 更改列表项为UIObjectCollection
* UIScrollingText: 增加属性可设置双击暂停滚动
* UIEditForm: 动态生成表单,增加校验方法
* UIDoubleUpDown, UIIntegerUpDown: 将双击编辑更改为单机编辑并选中
* IFrame: 增加RemovePage接口
* UIMessageDialogUIMessageBox: 增加TopMost参数
* UIBarChart: 修改了一个显示负值的Bug
* UIForm: 加了个属性AllowAddControlOnTitle允许在标题栏放置控件
* UICombobox: 解决鼠标下拉选择触发SelectedIndexChanged两次的问题
* UISwitch: 更新Active状态改变时触发ValueChanged事件
* UIDataGridView: 设置数据行头部颜色
* UIEditForm: 代码生成增加Switch类型增加Combobox类型
* UICheckBoxUIRadioButton: 增加默认事件CheckedChanged
* UIProcessBar: 可设置显示进度条小数个数
* 等待提示框: 更新等待时间短时无法关闭等待窗体的问题
* DirEx: 增加一个文件夹选择框
* UITextBox: 增加ShowScrollBar属性单独控制垂直滚动条
* UITextBox: 不限制高度为根据字体计算,可进行调整
* UITextBox: 解决多行输入时不能输入回车的问题
* UITextBox: 修改文字可以居中显示
* UIDatePicker,UIDateTimePicker: 增加ShowToday显示今日属性
* UILineChart: 有右键菜单时取消恢复上次缩放可在右键菜单增加节点调用ZoomBack()方法
#### 2021-04-11 V3.0.2
:fa-plus: UIMarkLabel增加带颜色标签的Label
:fa-plus: UIRoundProcess圆形滚动条
:fa-plus: UIBreadcrumb增加面包屑导航
:fa-plus: UILedLabel增加Led标签
:fa-asterisk: UIHeaderButton在工具箱中显示
:fa-asterisk: UILineChart支持拖拽选取放大
:fa-asterisk: UIDateTimePicker修复下拉选择日期后关闭的Bug
:fa-asterisk: UINavMenu增加设置二级菜单底色
:fa-asterisk: UIColorPicker增加单击事件以选中颜色
:fa-asterisk: UITitlePage增加ShowTitle可控制是否显示标题
:fa-asterisk: UINavBar增加可设置背景图片
:fa-asterisk: 框架增加IFrame接口方便页面跳转
:fa-asterisk: UIDataGridView修改垂直滚动条和原版一致,并增加翻页方式滚动
:fa-asterisk: UIPagination: 修正因两次查询数量相等而引起的不刷新
:fa-asterisk: UIHeaderButton: 增加字体图标背景时鼠标移上背景色
:fa-asterisk: UITabControl修改第一个TabPage关不掉的Bug
:fa-asterisk: UIDataGridView增加EnterAsTab属性编辑输入时用Enter键代替Tab键跳到下一个单元格
:fa-asterisk: UILineChart增加鼠标框选放大,可多次放大,右键点击恢复一次,双击恢复
:fa-asterisk: UITitlePanel修复OnMouseMove事件
:fa-asterisk: UITrackBar增加垂直显示方式
:fa-asterisk: UIFlowLayoutPanel修改了一处因为其加入控件大小发生变化而引起的滚动条出错
+ UIMarkLabel: 增加带颜色标签的Label
+ UIRoundProcess: 圆形滚动条
+ UIBreadcrumb: 增加面包屑导航
+ UILedLabel: 增加Led标签
* UIHeaderButton: 在工具箱中显示
* UILineChart: 支持拖拽选取放大
* UIDateTimePicker: 修复下拉选择日期后关闭的Bug
* UINavMenu: 增加设置二级菜单底色
* UIColorPicker: 增加单击事件以选中颜色
* UITitlePage: 增加ShowTitle可控制是否显示标题
* UINavBar: 增加可设置背景图片
* 框架增加IFrame接口方便页面跳转
* UIDataGridView: 修改垂直滚动条和原版一致,并增加翻页方式滚动
* UIPagination: 修正因两次查询数量相等而引起的不刷新
* UIHeaderButton: 增加字体图标背景时鼠标移上背景色
* UITabControl: 修改第一个TabPage关不掉的Bug
* UIDataGridView: 增加EnterAsTab属性编辑输入时用Enter键代替Tab键跳到下一个单元格
* UILineChart: 增加鼠标框选放大,可多次放大,右键点击恢复一次,双击恢复
* UITitlePanel: 修复OnMouseMove事件
* UITrackBar: 增加垂直显示方式
* UIFlowLayoutPanel: 修改了一处因为其加入控件大小发生变化而引起的滚动条出错
#### 2021-02-26 V3.0.1
:fa-plus: UIForm标题栏增加扩展按钮
:fa-plus: UIHeaderButton新增大图标的导航按钮
:fa-plus: 新增UIComboboxEx从Combobox原生控件继承以方便做查询过滤等操作
:fa-asterisk: UIForm修正不显示标题栏时,标题栏位置可放置控件
:fa-asterisk: UIListBox增加一些原有属性
:fa-asterisk: FCombobox增加数据绑定Demo
:fa-asterisk: UICombobox更改索引改变事件的多次触发
:fa-asterisk: UIForm修改一处Icon图片显示的问题
:fa-asterisk: UIEditForm修改通过代码生成窗体控件的TabIndex
:fa-asterisk: UIDatePickerUIDateTimePicker将日期选择控件的最小值调整为1900年
:fa-asterisk: UIHeaderButton将其命名空间从Sunny.UI.Control改为Sunny.UI
+ UIForm: 标题栏增加扩展按钮
+ UIHeaderButton: 新增大图标的导航按钮
+ 新增UIComboboxEx从Combobox原生控件继承以方便做查询过滤等操作
* UIForm: 修正不显示标题栏时,标题栏位置可放置控件
* UIListBox: 增加一些原有属性
* FCombobox: 增加数据绑定Demo
* UICombobox: 更改索引改变事件的多次触发
* UIForm: 修改一处Icon图片显示的问题
* UIEditForm: 修改通过代码生成窗体控件的TabIndex
* UIDatePickerUIDateTimePicker: 将日期选择控件的最小值调整为1900年
* UIHeaderButton: 将其命名空间从Sunny.UI.Control改为Sunny.UI
#### 2021-01-26 V3.0.0
:fa-plus: 同时兼容.Net Framework 4.0:fa-plus:、.Net Core3.1、.Net 5 框架
:fa-asterisk: 更新UIMessageTip
:fa-asterisk: UIForm增加ShowTitleIcon用来显示标题栏图标与ShowIcon分开
:fa-asterisk: UINavBar增加下拉菜单可设置自动高度或者固定高度可显示ImageList绑定
:fa-asterisk: UIDataGridView更新行头和列头的选中颜色
+ 同时兼容.Net Framework 4.0+:、.Net Core3.1、.Net 5 框架
* 更新UIMessageTip
* UIForm: 增加ShowTitleIcon用来显示标题栏图标与ShowIcon分开
* UINavBar: 增加下拉菜单可设置自动高度或者固定高度可显示ImageList绑定
* UIDataGridView更新行头和列头的选中颜色
#### 2021-01-05 V2.2.10
:fa-asterisk: V2.2 .Net Framewok 4.0最终版本
:fa-asterisk: V3.0 开始将同时兼容.Net Framework 4.0:fa-plus:、.Net Core3.1、.Net 5 框架
* V2.2 .Net Framewok 4.0最终版本
* V3.0 开始将同时兼容.Net Framework 4.0+:、.Net Core3.1、.Net 5 框架
#### 2020-12-20 V2.2.9
:fa-plus: UIWaitForm等待窗体
:fa-plus: UIComboTreeView新增下拉框TreeView
:fa-plus: UIMessageForm消息提示框增加黑色半透明遮罩层
:fa-plus: Win32API新增Win32API函数
:fa-plus: UJsonConfig不引用第三方控件,用.Net自带的序列化实现Json增加Json文件配置类
:fa-plus: UIDataGridViewForm增加了一个表格模板基类
:fa-asterisk: UIDataGridView修改DataSource赋值后Column改变引起的水平滚动条错误
:fa-asterisk: UIDoubleUpDownUIIntegerUpDown增加双击可编辑数值
:fa-asterisk: UINavMenu增加选中后图标的背景色或应用选中图片索引
:fa-asterisk: 页面框架增加页面内跳转方法
:fa-asterisk: 日期、时间选择框增加CanEmpty输入可为空
+ UIWaitForm: 等待窗体
+ UIComboTreeView: 新增下拉框TreeView
+ UIMessageForm: 消息提示框增加黑色半透明遮罩层
+ Win32API: 新增Win32API函数
+ UJsonConfig: 不引用第三方控件,用.Net自带的序列化实现Json增加Json文件配置类
+ UIDataGridViewForm: 增加了一个表格模板基类
* UIDataGridView: 修改DataSource赋值后Column改变引起的水平滚动条错误
* UIDoubleUpDownUIIntegerUpDown: 增加双击可编辑数值
* UINavMenu: 增加选中后图标的背景色或应用选中图片索引
* 页面框架增加页面内跳转方法
* 日期、时间选择框增加CanEmpty输入可为空
#### 2020-10-12 V2.2.8
:fa-plus: UILineChart完成曲线图表
:fa-plus: UIScale增加坐标轴刻度计算类
:fa-plus: UIFlowLayoutPanel增加
:fa-plus: UIBarChartEx增加了一个新的柱状图类型,序列个数可以不相等
:fa-plus: UDateTimeInt64增加DateTimeInt64类时间整形互转类
:fa-asterisk: UIForm增加窗体阴影
:fa-asterisk: UIMainFrame页面框架增加Selecting事件在页面切换时执行该事件
:fa-asterisk: UITextBox解决Anchor包含Top、Bottom时在窗体最小化后恢复时高度变化
:fa-asterisk: UISwitch增加长方形形状开关,取消长宽比锁定
:fa-asterisk: UITreeView背景色可改设置FillColor以及SystemCustomMode = true
:fa-asterisk: UIDataGridView解决水平滚动条在有列冻结时出错的问题
+ UILineChart: 完成曲线图表
+ UIScale: 增加坐标轴刻度计算类
+ UIFlowLayoutPanel: 增加
+ UIBarChartEx: 增加了一个新的柱状图类型,序列个数可以不相等
+ UDateTimeInt64: 增加DateTimeInt64类时间整形互转类
* UIForm: 增加窗体阴影
* UIMainFrame: 页面框架增加Selecting事件在页面切换时执行该事件
* UITextBox: 解决Anchor包含Top、Bottom时在窗体最小化后恢复时高度变化
* UISwitch: 增加长方形形状开关,取消长宽比锁定
* UITreeView: 背景色可改设置FillColor以及SystemCustomMode = true
* UIDataGridView: 解决水平滚动条在有列冻结时出错的问题
#### 2020-09-17 V2.2.7
:fa-plus: 新增双主键线程安全字典,分组线程安全字典
:fa-plus: UIHorScrollBarExUIVerScrollBarEx重写了两个滚动条
:fa-asterisk: UIForm恢复了WindowState增加了窗体可拉拽调整大小
:fa-asterisk: 增加控件属性显示值及Sunny UI分类
:fa-asterisk: UIDateTimePicker,UITimePicker更改滚轮选择时间的方向
:fa-asterisk: UIButtonTips颜色可设置
:fa-asterisk: UIChart增加图表的边框线颜色设置
:fa-asterisk: UITextBox增加FocusedSelectAll属性激活时全选
:fa-asterisk: UINavBar增加节点的Image绘制
:fa-asterisk: UIDataGridView调整水平滚动条
:fa-asterisk: UIButton添加'是否启用双击事件'属性,解决连续点击效率问题
:fa-asterisk: UIDataGridView更新了水平和垂直滚动条的显示,优化滚动效果
:fa-asterisk: UIBbutton空格键按下press背景效果
:fa-asterisk: UIListBox优化滚轮快速滚动流畅性
:fa-asterisk: UIBarChart可设置柱状图最小宽度
:fa-asterisk: UIIntegerUpDown, UIDoubleUpDown增加字体调整
:fa-asterisk: UITabControl标题垂直居中
:fa-asterisk: UITreeView更新可设置背景色
:fa-asterisk: UIDatePickerUITimePickerUIDateTimePicker可编辑输入,日期范围控制
:fa-asterisk: UIDatePicker更改日期范围最小值和最大值
:fa-asterisk: UITitlePanel更新大小调整后的按钮位置
+ 新增双主键线程安全字典,分组线程安全字典
+ UIHorScrollBarExUIVerScrollBarEx: 重写了两个滚动条
* UIForm: 恢复了WindowState增加了窗体可拉拽调整大小
* 增加控件属性显示值及Sunny UI分类
* UIDateTimePicker,UITimePicker: 更改滚轮选择时间的方向
* UIButton: Tips颜色可设置
* UIChart: 增加图表的边框线颜色设置
* UITextBox: 增加FocusedSelectAll属性激活时全选
* UINavBar: 增加节点的Image绘制
* UIDataGridView: 调整水平滚动条
* UIButton: 添加'是否启用双击事件'属性,解决连续点击效率问题
* UIDataGridView: 更新了水平和垂直滚动条的显示,优化滚动效果
* UIBbutton: 空格键按下press背景效果
* UIListBox优化滚轮快速滚动流畅性
* UIBarChart: 可设置柱状图最小宽度
* UIIntegerUpDown, UIDoubleUpDown: 增加字体调整
* UITabControl: 标题垂直居中
* UITreeView: 更新可设置背景色
* UIDatePickerUITimePickerUIDateTimePicker: 可编辑输入,日期范围控制
* UIDatePicker: 更改日期范围最小值和最大值
* UITitlePanel: 更新大小调整后的按钮位置
#### 2020-07-30 V2.2.6
:fa-plus: UIPagination新增分页控件
:fa-plus: UIToolTip新增控件,可修改字体
:fa-plus: UIHorScrollBar新增水平滚动条
:fa-plus: UIWaitingBar新增等待滚动条控件
:fa-asterisk: UIDataGridView重绘水平滚动条,更新默认设置为原生控件设置
:fa-asterisk: UITitlePanel增加可收缩选项
:fa-asterisk: UIPieChart,UIBarChart增加序列自定义颜色
:fa-asterisk: UISymbolButton增加Image属性增加图片和文字的摆放位置
:fa-asterisk: UIButton增加Selected及选中颜色配置
:fa-asterisk: UIForm支持点击窗体任务栏图标,可以进行最小化
:fa-asterisk: UIForm增加标题栏ICON图标绘制
:fa-asterisk: UIDateTimePicker重写下拉窗体,缩短创建时间
:fa-asterisk: UITreeView全部重写增加圆角CheckBoxes等
:fa-asterisk: UIDatePicker重写下拉窗体,缩短创建时间
:fa-asterisk: UICheckBoxGroup,UIRadioButtonGroup可以设置初始选中值
:fa-asterisk: UILedBulb边缘平滑
:fa-asterisk: UIForm仿照QQ重绘标题栏按钮
+ UIPagination: 新增分页控件
+ UIToolTip: 新增控件,可修改字体
+ UIHorScrollBar: 新增水平滚动条
+ UIWaitingBar: 新增等待滚动条控件
* UIDataGridView: 重绘水平滚动条,更新默认设置为原生控件设置
* UITitlePanel: 增加可收缩选项
* UIPieChart,UIBarChart: 增加序列自定义颜色
* UISymbolButton: 增加Image属性增加图片和文字的摆放位置
* UIButton: 增加Selected及选中颜色配置
* UIForm: 支持点击窗体任务栏图标,可以进行最小化
* UIForm: 增加标题栏ICON图标绘制
* UIDateTimePicker: 重写下拉窗体,缩短创建时间
* UITreeView: 全部重写增加圆角CheckBoxes等
* UIDatePicker: 重写下拉窗体,缩短创建时间
* UICheckBoxGroup,UIRadioButtonGroup: 可以设置初始选中值
* UILedBulb: 边缘平滑
* UIForm: 仿照QQ重绘标题栏按钮
#### 2020-06-29 V2.2.5
:fa-plus: UIDoughnutChart环状图
:fa-plus: UILoginForm登录窗体
:fa-plus: UIScrollingText滚动文字
:fa-plus: UIBarChart柱状图
:fa-plus: UIPieChart饼状图
:fa-plus: UIRichTextBox富文本框
:fa-plus: UIBattery电池电量显示
:fa-plus: UIDatetimePicker日期时间选择框
:fa-plus: UIColorPicker颜色选择框
:fa-plus: UITimePicker时间选择框
:fa-plus: UIMessageTipHelper增加MessageTip扩展方法
:fa-asterisk: UIComboBox增加数据绑定
:fa-asterisk: 页面框架支持通过PageIndex和PageGuid关联
:fa-asterisk: UITextBox增加Multiline属性增加滚动条
:fa-asterisk: UITabControl新增关闭按钮,重绘左右移动按钮
:fa-asterisk: UIForm更新标题移动、双击最大化/正常、到顶最大化、最大化后拖拽正常
:fa-asterisk: UINavMenu增加字体图标显示
:fa-asterisk: 字体图标字体调整从资源文件中加载字体,不用另存为文件
:fa-asterisk: UIListBox 增加跟随鼠标滑过高亮
:fa-asterisk: UIDatePicker重写日期选择界面
:fa-asterisk: UIButton增加ShowFocusLine可获得焦点并显示
+ UIDoughnutChart: 环状图
+ UILoginForm: 登录窗体
+ UIScrollingText: 滚动文字
+ UIBarChart: 柱状图
+ UIPieChart: 饼状图
+ UIRichTextBox: 富文本框
+ UIBattery: 电池电量显示
+ UIDatetimePicker: 日期时间选择框
+ UIColorPicker: 颜色选择框
+ UITimePicker: 时间选择框
+ UIMessageTipHelper: 增加MessageTip扩展方法
* UIComboBox: 增加数据绑定
* 页面框架支持通过PageIndex和PageGuid关联
* UITextBox: 增加Multiline属性增加滚动条
* UITabControl: 新增关闭按钮,重绘左右移动按钮
* UIForm: 更新标题移动、双击最大化/正常、到顶最大化、最大化后拖拽正常
* UINavMenu: 增加字体图标显示
* 字体图标字体调整从资源文件中加载字体,不用另存为文件
* UIListBox 增加跟随鼠标滑过高亮
* UIDatePicker: 重写日期选择界面
* UIButton: 增加ShowFocusLine可获得焦点并显示
#### 2020.05.05 V2.2.5
:fa-plus: 增加页面框架
:fa-plus: 增加下拉框窗体,进度提升窗体
:fa-plus: UITreeView
+ 增加页面框架
+ 增加下拉框窗体,进度提升窗体
+ UITreeView
#### 2020.04.25 V2.2.4
:fa-asterisk: 更新主题风格类,各控件主题颜色调用不交叉,便于新增主题
:fa-plus: 更新Sunny.Demo程序
:fa-plus: 增加UIDataGridView基于DataGridView增强、美化
:fa-minus: UIGrid效率待改暂时隐藏
* 更新主题风格类,各控件主题颜色调用不交叉,便于新增主题
+ 更新Sunny.Demo程序
+ 增加UIDataGridView基于DataGridView增强、美化
- UIGrid效率待改暂时隐藏
#### 2020.04.19 V2.2.3
:fa-plus: UICheckBoxGroup,UIRadioButtonGroup
+ UICheckBoxGroup,UIRadioButtonGroup
#### 2020.04.11 V2.2.2
:fa-plus: 新增UIGrid
:fa-minus: 继承DataGridView更改主题风格的UIGridView
+ 新增UIGrid
- 继承DataGridView更改主题风格的UIGridView
#### 2020.02.15 V2.2.1
:fa-asterisk: Bug修复
* Bug修复
#### 2020.01.01 V2.2.0
:fa-asterisk: 增加文件说明,为开源做准备
:fa-plus: 增加Office主题风格
* 增加文件说明,为开源做准备
+ 增加Office主题风格
#### 2019.10.01 V2.1.0
:fa-plus: 增加Element主题风格
+ 增加Element主题风格
#### 2019.03.12 V2.0.0
:fa-plus: 增加自定义控件
+ 增加自定义控件
#### 2012.03.31 V1.0.0
:fa-plus: 增加工具类、扩展类
+ 增加工具类、扩展类