wpf linux 开发教程 pdf,WPF 分享一种设置程序保存配置文件的方法

原文:

WPF 分享一种设置程序保存配置文件的方法

最近需要做一个配置程序,主要给其他程序做相关配置的小工具。

f03882d68680d70b888e1a67168e8146.png

配置项蛮多的,一般我们都是将各个配置项写到配置文件的节点中,比如App.config文件或者自定义的xml文件。

因为我用的是wpf,MVVM,所以其实界面上的所有数据我都存着ViewModel的实体属性中。比如我们新建一个Model,叫SettingModel,界面上不管做任何更改,其实数据都和SettingModel中一样。

我们将这个SettingModel的内存数据序列化到本地文件。等下次运行程序时,再去反序列化将SettingModel的数据加载到ViewModel中。

6f021dcd3cafef83e8d66bad20a78c2b.gif

3a5ee135a661f19b4368e00d0659887b.gif

public classSettingModel:ObservableObject

{private string_FConnStr;public stringFConnStr

{get { return_FConnStr; }set { _FConnStr = value; RaisePropertyChanged("FConnStr"); }

}private string_DBType;public stringDBType

{get { return_DBType; }set { _DBType = value; RaisePropertyChanged("DBType"); }

}private string_SupplierName;public stringSupplierName

{get { return_SupplierName; }set { _SupplierName = value; RaisePropertyChanged("SupplierName"); }

}private string_SupplierNo;public stringSupplierNo

{get { return_SupplierNo; }set { _SupplierNo = value; RaisePropertyChanged("SupplierNo"); }

}private List_SQLList;public ListSQLList

{get { return_SQLList; }set { _SQLList = value; RaisePropertyChanged("SQLList"); }

}private string_StartTime;public stringStartTime

{get { return_StartTime; }set { _StartTime = value; RaisePropertyChanged("StartTime"); }

}private string_EndTime;public stringEndTime

{get { return_EndTime; }set { _EndTime = value; RaisePropertyChanged("EndTime"); }

}private int_Rate;public intRate

{get { return_Rate; }set { _Rate = value; RaisePropertyChanged("Rate"); }

}privateDateTime _TransmissionDate;publicDateTime TransmissionDate

{get { return_TransmissionDate; }set { _TransmissionDate = value; RaisePropertyChanged("TransmissionDate"); }

}private string_ServiceAddress;public stringServiceAddress

{get { return_ServiceAddress; }set { _ServiceAddress = value; RaisePropertyChanged("ServiceAddress"); }

}

}

View Code

序列化和反序列化方法

public static void MySerialize(T s)

{

FileStream fileStream= new FileStream(AppDomain.CurrentDomain.BaseDirectory + "/Config/config.dat", FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite);

BinaryFormatter formatter= newBinaryFormatter();

formatter.Serialize(fileStream, s);

fileStream.Close();

}//T 可以是类型

public static T MyBackSerialize(stringpath)

{

FileStream fileStream= newFileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);

BinaryFormatter formatter= newBinaryFormatter();

T s=(T)formatter.Deserialize(fileStream);

fileStream.Close();returns;

}

但是实行过程中遇到个问题,因为使用了MVVM,Model都实现了INotifyPropertyChanged接口。但是序列化的时候不可以序列化。

于是我们需要再添加一个Model,结构和SettingModel一样,但是不实现INotifyPropertyChanged接口。

370ae1be9570ea94ca5b0979a5499b35.gif

07c1867b315a2883edf6018f0f0a214b.gif

[Serializable]public classSettingModelBack

{private string_FConnStr;public stringFConnStr

{get { return_FConnStr; }set { _FConnStr =value;}

}private string_DBType;public stringDBType

{get { return_DBType; }set { _DBType =value;}

}private string_SupplierName;public stringSupplierName

{get { return_SupplierName; }set { _SupplierName =value; }

}private string_SupplierNo;public stringSupplierNo

{get { return_SupplierNo; }set { _SupplierNo =value; }

}private List_SQLList;public ListSQLList

{get { return_SQLList; }set { _SQLList =value; }

}private string_StartTime;public stringStartTime

{get { return_StartTime; }set { _StartTime =value; }

}private string_EndTime;public stringEndTime

{get { return_EndTime; }set { _EndTime =value; }

}private int_Rate;public intRate

{get { return_Rate; }set { _Rate =value; }

}privateDateTime _TransmissionDate;publicDateTime TransmissionDate

{get { return_TransmissionDate; }set { _TransmissionDate =value; }

}private string_ServiceAddress;public stringServiceAddress

{get { return_ServiceAddress; }set { _ServiceAddress =value; }

}

}

View Code

此Model类上添加 [Serializable]标记。

这样我们在保存时,需要将SettingModel的数据赋给SettingModelBack,我们可以用AutoMapper来实现,很方便。

private voidSave()

{var config = AutoMapper.Mapper.Map(Master);

MySerialize(config);

dialogCoordinator.ShowMessageAsync(this, "", "保存成功!");

}

我们在应用程序中,想读取配置文件中的信息,我们可以反序列化配置文件,将数据还原到Model中。

string path = AppDomain.CurrentDomain.BaseDirectory + "/Config/config.dat";var configData= MyBackSerialize(path);

这种保存配置文件的方式,有个好处就是如果有新的配置项需要保存,我们只需要在Model中添加相应的属性,并绑定到界面上(WPF本来也需要做这个事),而不需要再去写创建新节点,修改新节点的代码。但是也有个不方便的地方,就是不可以在文本中修改配置文件了,只能通过配置工具修改,因为保存到本地config.dat中的文件打开后是乱码了。

61ff6652005bab4de4876ec086d96681.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值