V3.2.5
This commit is contained in:
parent
b7e75e7826
commit
c0386ee9f8
@ -1,134 +0,0 @@
|
|||||||
/******************************************************************************
|
|
||||||
* SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。
|
|
||||||
* CopyRight (C) 2012-2022 ShenYongHua(沈永华).
|
|
||||||
* QQ群:56829229 QQ:17612584 EMail:SunnyUI@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.
|
|
||||||
* 如果您使用此代码,请保留此说明。
|
|
||||||
******************************************************************************
|
|
||||||
* 文件名称: UIniConfig.cs
|
|
||||||
* 文件说明: INI 配置文件类
|
|
||||||
* 当前版本: V3.1
|
|
||||||
* 创建日期: 2020-01-01
|
|
||||||
*
|
|
||||||
* 2020-01-01: V2.2.0 增加文件说明
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Collections.Specialized;
|
|
||||||
using System.IO;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace Sunny.UI
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// INI 配置文件类
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TConfig">类型</typeparam>
|
|
||||||
public class IniConfig<TConfig> : BaseConfig<TConfig> where TConfig : IniConfig<TConfig>, new()
|
|
||||||
{
|
|
||||||
#region 加载
|
|
||||||
|
|
||||||
/// <summary>加载指定配置文件</summary>
|
|
||||||
/// <param name="filename">文件名</param>
|
|
||||||
/// <returns>结果</returns>
|
|
||||||
public override bool Load(string filename)
|
|
||||||
{
|
|
||||||
if (filename.IsNullOrWhiteSpace())
|
|
||||||
{
|
|
||||||
filename = DirEx.CurrentDir() + ConfigFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filename.IsNullOrWhiteSpace())
|
|
||||||
{
|
|
||||||
throw new ApplicationException($"未指定{typeof(TConfig).Name}的配置文件路径!");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!File.Exists(filename))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ConcurrentDictionary<string, Ident> idents = ConfigHelper.InitIdents(current);
|
|
||||||
foreach (var ident in idents.Values)
|
|
||||||
{
|
|
||||||
if (ident.Section.IsNullOrEmpty())
|
|
||||||
{
|
|
||||||
ident.Section = "Setup";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
IniFile ini = new IniFile(filename, Encoding.Unicode);
|
|
||||||
foreach (var ident in idents.Values)
|
|
||||||
{
|
|
||||||
if (ident.IsList)
|
|
||||||
{
|
|
||||||
ident.Values.Clear();
|
|
||||||
NameValueCollection list = ini.GetSectionValues(ident.Section + "-" + ident.Key);
|
|
||||||
foreach (var pair in list)
|
|
||||||
{
|
|
||||||
ident.Values.Add(ini.ReadString(ident.Section + "-" + ident.Key, pair.ToString(), ""));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ident.Value = ini.ReadString(ident.Section, ident.Key, "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigHelper.LoadConfigValue(current, idents);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine(ex.Message);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>保存到配置文件中去</summary>
|
|
||||||
/// <param name="filename">文件名</param>
|
|
||||||
public override void Save(string filename)
|
|
||||||
{
|
|
||||||
if (filename.IsNullOrWhiteSpace())
|
|
||||||
{
|
|
||||||
filename = DirEx.CurrentDir() + ConfigFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filename.IsNullOrWhiteSpace())
|
|
||||||
{
|
|
||||||
throw new ApplicationException($"未指定{typeof(TConfig).Name}的配置文件路径!");
|
|
||||||
}
|
|
||||||
|
|
||||||
ConcurrentDictionary<string, Ident> idents = ConfigHelper.InitIdents(current);
|
|
||||||
foreach (var ident in idents.Values)
|
|
||||||
{
|
|
||||||
if (ident.Section.IsNullOrEmpty())
|
|
||||||
{
|
|
||||||
ident.Section = "Setup";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigHelper.SaveConfigValue(Current, idents);
|
|
||||||
IniFile ini = new IniFile(filename, Encoding.Unicode);
|
|
||||||
ini.BeginUpdate();
|
|
||||||
|
|
||||||
foreach (var ident in idents.Values)
|
|
||||||
{
|
|
||||||
ini.Write(ident.Section, ident.Key, ident.Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
ini.EndUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion 加载
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,850 +0,0 @@
|
|||||||
/******************************************************************************
|
|
||||||
* SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。
|
|
||||||
* CopyRight (C) 2012-2022 ShenYongHua(沈永华).
|
|
||||||
* QQ群:56829229 QQ:17612584 EMail:SunnyUI@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.
|
|
||||||
* 如果您使用此代码,请保留此说明。
|
|
||||||
******************************************************************************
|
|
||||||
* 文件名称: UIniFile.cs
|
|
||||||
* 文件说明: INI 文件读取类
|
|
||||||
* 当前版本: V3.1
|
|
||||||
* 创建日期: 2020-01-01
|
|
||||||
*
|
|
||||||
* 2020-01-01: V2.2.0 增加文件说明
|
|
||||||
* 2022-09-13: V3.2.4 修改IniFile,改WinApi读取为直接C#代码读取
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Collections.Specialized;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Globalization;
|
|
||||||
using System.IO;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace Sunny.UI
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// INI 文件读取基类
|
|
||||||
/// </summary>
|
|
||||||
public abstract class IniBase : IDisposable
|
|
||||||
{
|
|
||||||
public IniBase(string fileName) : this(fileName, Encoding.Unicode) { }
|
|
||||||
|
|
||||||
public IniBase(string fileName, Encoding encoding)
|
|
||||||
{
|
|
||||||
Load(fileName, encoding);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
Save();
|
|
||||||
}
|
|
||||||
|
|
||||||
private IDictionary<string, IDictionary<string, object>> ini;
|
|
||||||
|
|
||||||
public string FileName { get; private set; }
|
|
||||||
|
|
||||||
private Encoding Encoding;
|
|
||||||
|
|
||||||
public void Load(string fileName)
|
|
||||||
{
|
|
||||||
Load(fileName, Encoding.Unicode);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Load(string fileName, Encoding encoding)
|
|
||||||
{
|
|
||||||
FileName = fileName;
|
|
||||||
Encoding = encoding;
|
|
||||||
|
|
||||||
if (!File.Exists(fileName))
|
|
||||||
{
|
|
||||||
ini = CreateDefault();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
using (var sr = new StreamReader(fileName, encoding))
|
|
||||||
{
|
|
||||||
ini = Read(sr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Save()
|
|
||||||
{
|
|
||||||
File.WriteAllText(FileName, ToString(), Encoding);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SaveAs(string fileName, Encoding encoding)
|
|
||||||
{
|
|
||||||
File.WriteAllText(fileName, ToString(), encoding);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Write(string section, string key, string value)
|
|
||||||
{
|
|
||||||
if (!ini.ContainsKey(section))
|
|
||||||
{
|
|
||||||
ini.Add(section, new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ini[section].ContainsKey(key))
|
|
||||||
{
|
|
||||||
ini[section][key] = value;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ini[section].Add(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (saveNow)
|
|
||||||
{
|
|
||||||
Save();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool saveNow = true;
|
|
||||||
public void BeginUpdate()
|
|
||||||
{
|
|
||||||
saveNow = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void EndUpdate()
|
|
||||||
{
|
|
||||||
saveNow = true;
|
|
||||||
Save();
|
|
||||||
}
|
|
||||||
|
|
||||||
public string ReadString(string section, string key, string Default = "")
|
|
||||||
{
|
|
||||||
return Read(section, key, Default);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected string Read(string section, string key, string Default = "")
|
|
||||||
{
|
|
||||||
if (ini.ContainsKey(section) && ini[section].ContainsKey(key))
|
|
||||||
{
|
|
||||||
return ini[section][key].ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
return Default;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
var sb = new StringBuilder();
|
|
||||||
foreach (var sentry in ini)
|
|
||||||
{
|
|
||||||
sb.AppendLine("[" + sentry.Key + "]");
|
|
||||||
var d = sentry.Value;
|
|
||||||
foreach (var entry in d)
|
|
||||||
{
|
|
||||||
if (entry.Value is IList<string>)
|
|
||||||
{
|
|
||||||
var l = ((IList<string>)entry.Value);
|
|
||||||
sb.AppendLine(string.Format("{0}={1}", entry.Key, l[0]));
|
|
||||||
for (var i = 1; i < l.Count; ++i)
|
|
||||||
{
|
|
||||||
sb.AppendLine("\t" + l[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
sb.AppendLine();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sb.AppendLine(string.Format("{0}={1}", entry.Key, entry.Value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return sb.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private IDictionary<string, IDictionary<string, object>> CreateDefault()
|
|
||||||
{
|
|
||||||
return new Dictionary<string, IDictionary<string, object>>(StringComparer.OrdinalIgnoreCase);
|
|
||||||
}
|
|
||||||
|
|
||||||
private IDictionary<string, IDictionary<string, object>> Read(TextReader reader)
|
|
||||||
{
|
|
||||||
var result = CreateDefault();
|
|
||||||
|
|
||||||
int lc = 1;
|
|
||||||
string section = "";
|
|
||||||
string name = null;
|
|
||||||
string line;
|
|
||||||
while (null != (line = reader.ReadLine()))
|
|
||||||
{
|
|
||||||
var i = line.IndexOf(';');
|
|
||||||
if (i > -1)
|
|
||||||
{
|
|
||||||
line = line.Substring(0, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
line = line.Trim();
|
|
||||||
if (!string.IsNullOrEmpty(line))
|
|
||||||
{
|
|
||||||
if (line.Length > 2 && line[0] == '[' && line[line.Length - 1] == ']')
|
|
||||||
{
|
|
||||||
section = line.Substring(1, line.Length - 2);
|
|
||||||
if (!result.ContainsKey(section))
|
|
||||||
{
|
|
||||||
result.Add(section, new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var d = result[section];
|
|
||||||
i = line.IndexOf('=');
|
|
||||||
if (i > -1)
|
|
||||||
{
|
|
||||||
name = line.Substring(0, i).TrimEnd();
|
|
||||||
if (d.TryGetValue(name, out object o))
|
|
||||||
{
|
|
||||||
AddIniEntryValue(d, line, name, i, o);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
d.Add(name, line.Substring(i + 1).TrimStart());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (null == name)
|
|
||||||
{
|
|
||||||
throw new IOException("Invalid INI file at line " + lc.ToString());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var o = d[name];
|
|
||||||
AddIniEntryValue(d, line, name, i, o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
++lc;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddIniEntryValue(IDictionary<string, object> d, string line, string name, int i, object o)
|
|
||||||
{
|
|
||||||
if (o is string)
|
|
||||||
{
|
|
||||||
var s = (string)o;
|
|
||||||
d.Remove(name);
|
|
||||||
var col = new List<string>();
|
|
||||||
d.Add(name, col);
|
|
||||||
col.Add(s);
|
|
||||||
col.Add(line.Substring(i + 1).TrimStart());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
((List<string>)o).Add(line.Substring(i + 1).TrimStart());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取指定的Section名称中的所有Key
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="section">section</param>
|
|
||||||
/// <returns>结果</returns>
|
|
||||||
public string[] GetKeys(string section)
|
|
||||||
{
|
|
||||||
return ini.ContainsKey(section) && ini[section].Count > 0 ? (string[])ini[section].Keys : new string[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 从Ini文件中,读取所有的Sections的名称
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public string[] Sections()
|
|
||||||
{
|
|
||||||
return ini != null ? (string[])ini.Keys : new string[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 读取指定的Section的所有Value到列表中
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="section">section</param>
|
|
||||||
public NameValueCollection GetSectionValues(string section)
|
|
||||||
{
|
|
||||||
NameValueCollection values = new NameValueCollection();
|
|
||||||
string[] keys = GetKeys(section);
|
|
||||||
foreach (string key in keys)
|
|
||||||
{
|
|
||||||
values.Add(key, ini[section][key].ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
return values;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 清除某个Section
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="section">section</param>
|
|
||||||
public void EraseSection(string section)
|
|
||||||
{
|
|
||||||
if (ini.ContainsKey(section))
|
|
||||||
{
|
|
||||||
ini.Remove(section);
|
|
||||||
Save();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 删除某个Section下的键
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="section">section</param>
|
|
||||||
/// <param name="key">key</param>
|
|
||||||
public void DeleteKey(string section, string key)
|
|
||||||
{
|
|
||||||
if (KeyExists(section, key))
|
|
||||||
{
|
|
||||||
ini[section].Remove(key);
|
|
||||||
if (ini[section].Count == 0)
|
|
||||||
{
|
|
||||||
ini.Remove(section);
|
|
||||||
}
|
|
||||||
|
|
||||||
Save();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 检查某个Section下的某个键值是否存在
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="section">section</param>
|
|
||||||
/// <param name="key">key</param>
|
|
||||||
/// <returns>结果</returns>
|
|
||||||
public bool KeyExists(string section, string key)
|
|
||||||
{
|
|
||||||
return ini.ContainsKey(section) && ini[section].ContainsKey(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// IniFile的类
|
|
||||||
/// </summary>
|
|
||||||
public class IniFile : IniBase
|
|
||||||
{
|
|
||||||
public IniFile(string fileName) : base(fileName, Encoding.Unicode) { }
|
|
||||||
|
|
||||||
public IniFile(string fileName, Encoding encoding) : base(fileName, encoding) { }
|
|
||||||
|
|
||||||
/// <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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,88 +0,0 @@
|
|||||||
using Sunny.UI.Win32;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace Sunny.UI
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 其他
|
|
||||||
/// </summary>
|
|
||||||
public static class UIOther
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 值不为数字
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="d">值</param>
|
|
||||||
/// <returns>不为数字</returns>
|
|
||||||
public static bool IsNan(this double d)
|
|
||||||
{
|
|
||||||
return double.IsNaN(d);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 值不为数字
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="d">值</param>
|
|
||||||
/// <returns>不为数字</returns>
|
|
||||||
public static bool IsNan(this float d)
|
|
||||||
{
|
|
||||||
return float.IsNaN(d);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 值负无穷或者正无穷
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="d">值</param>
|
|
||||||
/// <returns>负无穷或者正无穷</returns>
|
|
||||||
public static bool IsInfinity(this double d)
|
|
||||||
{
|
|
||||||
return double.IsInfinity(d);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 值负无穷或者正无穷
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="d">值</param>
|
|
||||||
/// <returns>负无穷或者正无穷</returns>
|
|
||||||
public static bool IsInfinity(this float d)
|
|
||||||
{
|
|
||||||
return float.IsInfinity(d);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 值不为数字或者负无穷或者正无穷
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="d">值</param>
|
|
||||||
/// <returns>不为数字或者负无穷或者正无穷</returns>
|
|
||||||
public static bool IsNanOrInfinity(this double d)
|
|
||||||
{
|
|
||||||
return d.IsNan() || d.IsInfinity();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 值不为数字或者负无穷或者正无穷
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="d">值</param>
|
|
||||||
/// <returns>不为数字或者负无穷或者正无穷</returns>
|
|
||||||
public static bool IsNanOrInfinity(this float d)
|
|
||||||
{
|
|
||||||
return d.IsNan() || d.IsInfinity();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 自然排序
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="strs">字符串列表</param>
|
|
||||||
/// <returns>自然排序结果</returns>
|
|
||||||
/// var names = new [] { "2.log", "10.log", "1.log" };
|
|
||||||
/// 排序结果:
|
|
||||||
/// 1.log
|
|
||||||
/// 2.log
|
|
||||||
/// 10.log
|
|
||||||
public static IOrderedEnumerable<string> NatualOrdering(this IEnumerable<string> strs)
|
|
||||||
{
|
|
||||||
if (strs == null) return null;
|
|
||||||
return strs.OrderBy(s => s, new NatualOrderingComparer());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -31,7 +31,7 @@ namespace Sunny.UI
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 版本
|
/// 版本
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const string Version = "SunnyUI.Net V3.2.4";
|
public const string Version = "SunnyUI.Net V3.2.5";
|
||||||
|
|
||||||
public const int EditorMinHeight = 20;
|
public const int EditorMinHeight = 20;
|
||||||
public const int EditorMaxHeight = 60;
|
public const int EditorMaxHeight = 60;
|
||||||
|
@ -371,13 +371,16 @@ namespace Sunny.UI
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
#if NETFRAMEWORK
|
||||||
var ReturnFlag = false;
|
var ReturnFlag = false;
|
||||||
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
|
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
|
||||||
ReturnFlag = true;
|
ReturnFlag = true;
|
||||||
else if (Process.GetCurrentProcess().ProcessName == "devenv")
|
else if (Process.GetCurrentProcess().ProcessName == "devenv")
|
||||||
ReturnFlag = true;
|
ReturnFlag = true;
|
||||||
|
|
||||||
return ReturnFlag;
|
return ReturnFlag;
|
||||||
|
#else
|
||||||
|
return IsAncestorSiteInDesignMode;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>net472;net40</TargetFrameworks>
|
<TargetFrameworks>net6.0-windows;net472;net40</TargetFrameworks>
|
||||||
<LangVersion>8.0</LangVersion>
|
<LangVersion>8.0</LangVersion>
|
||||||
<ProjectGuid>{AB1CB247-E20B-4CBE-B269-570ADDD96C53}</ProjectGuid>
|
<ProjectGuid>{AB1CB247-E20B-4CBE-B269-570ADDD96C53}</ProjectGuid>
|
||||||
<UseWindowsForms>true</UseWindowsForms>
|
<UseWindowsForms>true</UseWindowsForms>
|
||||||
@ -9,7 +9,7 @@
|
|||||||
<Description>SunnyUI.Net 是基于.Net Framework 4.0~4.8、.Net 6 框架的 C# WinForm 开源控件库、工具类库、扩展类库、多页面开发框架。</Description>
|
<Description>SunnyUI.Net 是基于.Net Framework 4.0~4.8、.Net 6 框架的 C# WinForm 开源控件库、工具类库、扩展类库、多页面开发框架。</Description>
|
||||||
<Copyright>CopyRight © SunnyUI.Net 2012-2022</Copyright>
|
<Copyright>CopyRight © SunnyUI.Net 2012-2022</Copyright>
|
||||||
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
||||||
<Version>3.2.4</Version>
|
<Version>3.2.5</Version>
|
||||||
<Authors>ShenYonghua</Authors>
|
<Authors>ShenYonghua</Authors>
|
||||||
<Company>SunnyUI.Net</Company>
|
<Company>SunnyUI.Net</Company>
|
||||||
<PackageId>SunnyUI</PackageId>
|
<PackageId>SunnyUI</PackageId>
|
||||||
@ -17,7 +17,7 @@
|
|||||||
<RepositoryUrl>https://gitee.com/yhuse/SunnyUI</RepositoryUrl>
|
<RepositoryUrl>https://gitee.com/yhuse/SunnyUI</RepositoryUrl>
|
||||||
<PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>
|
<PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>
|
||||||
<PackageIcon>SunnyUI.png</PackageIcon>
|
<PackageIcon>SunnyUI.png</PackageIcon>
|
||||||
<SignAssembly>False</SignAssembly>
|
<SignAssembly>True</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>D:\MyDocuments\SunnyUI.pfx</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>D:\MyDocuments\SunnyUI.pfx</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>False</DelaySign>
|
<DelaySign>False</DelaySign>
|
||||||
<GeneratePackageOnBuild>False</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>False</GeneratePackageOnBuild>
|
||||||
@ -75,7 +75,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="SunnyUI.Common" Version="3.2.*" />
|
<PackageReference Include="SunnyUI.Common" Version="3.2.5" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace Sunny.UI.Win32
|
namespace Sunny.UI.Win32
|
||||||
@ -10,6 +11,22 @@ namespace Sunny.UI.Win32
|
|||||||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释
|
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释
|
||||||
public static class Win32Helper
|
public static class Win32Helper
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 自然排序
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="strs">字符串列表</param>
|
||||||
|
/// <returns>自然排序结果</returns>
|
||||||
|
/// var names = new [] { "2.log", "10.log", "1.log" };
|
||||||
|
/// 排序结果:
|
||||||
|
/// 1.log
|
||||||
|
/// 2.log
|
||||||
|
/// 10.log
|
||||||
|
public static IOrderedEnumerable<string> NatualOrdering(this IEnumerable<string> strs)
|
||||||
|
{
|
||||||
|
if (strs == null) return null;
|
||||||
|
return strs.OrderBy(s => s, new NatualOrderingComparer());
|
||||||
|
}
|
||||||
|
|
||||||
public static readonly IntPtr TRUE = new IntPtr(1);
|
public static readonly IntPtr TRUE = new IntPtr(1);
|
||||||
|
|
||||||
public static IntPtr IntPtr(this int value)
|
public static IntPtr IntPtr(this int value)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user