Nico Game Studio 2.设置页面读写 纹理载入与选择

时间:2022-11-19 06:09:15

进度十分之慢...

配置读写一样采用之前写的自动绑定的方法:

分享一下代码:

SetControl是把数据写到control上的.

SetObject是把数据写到对象上

GetData是从控件读取数据,并获得包含这些数据的实例;

public static void SetControl(this Control control, object data)
{
var type = data.GetType();
Dictionary<string, object> values = new Dictionary<string, object>();
var fields = type.GetFields();
foreach (var f in fields)
{
if (values.ContainsKey(f.Name)==false)
{
values.Add(f.Name, f.GetValue(data));
}
}
SetData(control, values);
} public static T GetData<T>(this Control control) where T : new()
{
Dictionary<string, object> values=new Dictionary<string,object>();
CollectData(control,ref values);
if (values.Count > )
{
var newT= new T();
var type = typeof(T);
var fields= type.GetFields();
foreach (var f in fields)
{
if (values.ContainsKey(f.Name))
{
f.SetValue(newT, Convert.ChangeType(values[f.Name],f.FieldType));
}
}
return newT;
}
return default(T);
} public static void SetObject<T>(this Control control ,object obj)
{
Dictionary<string, object> values = new Dictionary<string, object>();
CollectData(control, ref values);
if (values.Count > )
{
var type = typeof(T);
var fields = type.GetFields();
foreach (var f in fields)
{
if (values.ContainsKey(f.Name))
{
f.SetValue(obj, Convert.ChangeType(values[f.Name], f.FieldType));
}
}
}
}

调用方式就是:

control.SetObject<SettingModel>(this);
  Util.SerializeUtil.Serialize2File(SaveFilePath, this);

因为是扩展方法,直接通过控件调用,然后序列化到文件中保存.

2.还做了纹理载入.这部分很简单.麻烦在于在一个控件展示数量可能很大的纹理阵列,还要可以选择,多选.

一开始采用自绘,双滚动条+Paint事件,SetStyle 双缓冲等 解决闪烁问题.后来想说用控件会不会更简单.

于是尝试了,Panel.isAutoScroll=true.往里加panel,设置其Image的方式.

这么做好处是绘图和事件触发很简单,但效率低,载入大图的时候就会卡很久.滚动条也较卡.

还是得自绘,自己做事件判断,效率比较高.

ikvmc.exe可以同时拖入多个jar包进行转换.会自动打包生成1个程序集.