ObservableCollection listContent = new ObservableCollection<Msg>();
void testLoadConfigContent()
{
string file = "data.d";
Msg[] obj;
// 打开文件,并进行反序列化得到对象
Stream stream = File.Open(file, FileMode.Open);
BinaryFormatter formatter = new BinaryFormatter();
//formatter = new BinaryFormatter();
obj = (Msg[])formatter.Deserialize(stream);
stream.Close();
listContent.Clear();
foreach (Msg m in obj)
{
if (""+m.color == "") { m.color = "Green"; }
if (m.isChecked)
{
m.color = "Green";
}
else {
m.color = "Gray";
}
listContent.Add(m);
}
}
void testSaveConfigContent()
{
string file = "data.d";
int cnt = listView.Items.Count;//listView 是UI上的列表控件
Msg[] obj = new Msg[cnt];
for (int i = 0; i < cnt; i++)
{
obj[i] =listView.Items[i] as Msg ;/// new Msg() { isChecked = listView.Items[i] as , word = "test" + i };
}
// 创建一个文件,并将对象序列化后存储在其中
Stream stream = File.Open(file, FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
//BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);
stream.Close();
// 将对象置空
obj = null;
}
}
[Serializable]
public class Msg
{
public string word { get; set; }
public bool isChecked { get; set; }
public string color { get; set; }
}
}
还有一种动态保存和载入UI 控件的办法
WPF使用XAML来描述用户界面,每个XAML元素往往对应着相应的WPF对象,元素的属性对应着对象的属性。
由于XAML元素与WPF对象之前存在着这种对应关系,其实可以将XAML代码看成是WPF对象“序列化”后的结果。
WPF提供了XamlWriter 和 XamlReader 两个类实现WPF对象的XAML序列化和反序列化。
void testLoadUIConfig()
{
//using System.Windows.Markup;
if (File.Exists("UI.dat"))
{
using (FileStream fs = new FileStream("UI.dat", FileMode.Open))
{
//调用XamlReader的方法从文件流中重建listView对象
listView = System.Windows.Markup.XamlReader.Load(fs) as ListView;
gridContainer.Children.Clear();
gridContainer.Children.Add (listView);
}
}
}
void testSaveUIConfig()
{
using (FileStream fs = new FileStream("UI.dat", FileMode.Create))
{
//当需要保存当前图形时,调用XamlWriter的以下方法将listView对象直接序列化到文件流中
System.Windows.Markup.XamlWriter.Save(listView, fs);
MessageBox.Show("数据已保存");
}
}