如何使C#WPF ContentControl可序列化?
我需要序列化包含图像和文本框的ContentControl列表,以便将它们保存到二进制文件中 错误消息 程序集“PresentationFramework,版本=4.0.0.0,区域性=中性,PublicKeyToken=31bf3856ad364e35”中的类型“System.Windows.Controls.ContentControl”未标记为可序列化。“如何使C#WPF ContentControl可序列化?,c#,wpf,C#,Wpf,我需要序列化包含图像和文本框的ContentControl列表,以便将它们保存到二进制文件中 错误消息 程序集“PresentationFramework,版本=4.0.0.0,区域性=中性,PublicKeyToken=31bf3856ad364e35”中的类型“System.Windows.Controls.ContentControl”未标记为可序列化。“ 无法序列化控件,因为它们是视图状态 如果您遵循MVVM,那么您的控件应该显示一个视图模型,该视图模型将操作一个模型,并且该模型是您应该
无法序列化控件,因为它们是视图状态 如果您遵循MVVM,那么您的控件应该显示一个视图模型,该视图模型将操作一个模型,并且该模型是您应该序列化的对象 这里有一个例子 XAML
Uri
添加
删除
取消
拯救
负载
模型
[Serializable]
public class ImageModel
{
public string Text { get; set; }
public Uri Uri { get; set; }
}
public class ImageCollectionModel
{
public List<ImageModel> Collection { get; } = new List<ImageModel>();
private BinaryFormatter Formatter = new BinaryFormatter();
public bool Save(FileInfo file)
{
try
{
using (var stream = file.OpenWrite())
{
Formatter.Serialize(stream, Collection);
return true;
}
}
catch (Exception)
{
return false;
}
}
public bool Load(FileInfo file)
{
try
{
using (var stream = file.OpenRead())
{
var col = Formatter.Deserialize(stream) as List<ImageModel>;
Collection.Clear();
Collection.AddRange(col);
return true;
}
}
catch (Exception)
{
return false;
}
}
}
[可序列化]
公共类图像模型
{
公共字符串文本{get;set;}
公共Uri{get;set;}
}
公共类ImageCollectionModel
{
公共列表集合{get;}=new List();
私有BinaryFormatter Formatter=新的BinaryFormatter();
公共bool保存(FileInfo文件)
{
尝试
{
使用(var stream=file.OpenWrite())
{
序列化(流、集合);
返回true;
}
}
捕获(例外)
{
返回false;
}
}
公共bool加载(FileInfo文件)
{
尝试
{
使用(var stream=file.OpenRead())
{
var col=格式化程序。反序列化(流)为列表;
Collection.Clear();
Collection.AddRange(col);
返回true;
}
}
捕获(例外)
{
返回false;
}
}
}
视图模型
public class ViewModel:BindableBase
{
public ViewModel()
{
Add = new DelegateCommand(() => Collection.Add(new ImageModel()
{
Text = NewText,
Uri = new Uri(NewUri)
}));
Delete = new DelegateCommand<ImageModel>(item => Collection.Remove(item));
Load = new DelegateCommand(() =>
{
var open = new Microsoft.Win32.OpenFileDialog();
if (open.ShowDialog() ?? false)
{
var file = new FileInfo(open.FileName);
if (file.Exists)
{
if (Model == null)
{
Model = new ImageCollectionModel();
}
Model.Load(file);
}
Cancel.Execute();
}
});
Save = new DelegateCommand(() =>
{
var save = new Microsoft.Win32.SaveFileDialog();
if (save.ShowDialog() ?? false)
{
var file = new FileInfo(save.FileName);
if (!file.Exists)
{
if (Model == null)
{
Model = new ImageCollectionModel();
}
Model.Collection.Clear();
Model.Collection.AddRange(Collection);
Model.Save(file);
}
}
});
Cancel = new DelegateCommand(() =>
{
Collection.Clear();
if (Model != null)
{
foreach (var item in Model.Collection)
{
Collection.Add(item);
}
}
});
Browse = new DelegateCommand(() =>
{
var open = new Microsoft.Win32.OpenFileDialog();
if (open.ShowDialog() ?? false)
{
NewUri = open.FileName;
}
});
}
public ImageCollectionModel Model { get; set; }
public ObservableCollection<ImageModel> Collection { get; } = new ObservableCollection<ImageModel>();
private string _NewText;
public string NewText
{
get { return _NewText; }
set { SetProperty(ref _NewText, value); }
}
private string _NewUri;
public string NewUri
{
get { return _NewUri; }
set { SetProperty(ref _NewUri, value); }
}
public DelegateCommand Add { get; }
public DelegateCommand<ImageModel> Delete { get; }
public DelegateCommand Browse { get; }
public DelegateCommand Load { get; }
public DelegateCommand Save { get; }
public DelegateCommand Cancel { get; }
}
public类ViewModel:BindableBase
{
公共视图模型()
{
Add=newdelegateCommand(()=>Collection.Add(newImageModel)()
{
Text=NewText,
Uri=新Uri(新Uri)
}));
Delete=newdelegateCommand(item=>Collection.Remove(item));
加载=新的DelegateCommand(()=>
{
var open=new Microsoft.Win32.OpenFileDialog();
如果(打开.ShowDialog()??错误)
{
var file=新文件信息(open.FileName);
如果(file.Exists)
{
if(Model==null)
{
模型=新的ImageCollectionModel();
}
模型加载(文件);
}
Cancel.Execute();
}
});
Save=新的DelegateCommand(()=>
{
var save=new Microsoft.Win32.SaveFileDialog();
if(save.ShowDialog()??false)
{
var file=新文件信息(save.FileName);
如果(!file.Exists)
{
if(Model==null)
{
模型=新的ImageCollectionModel();
}
Model.Collection.Clear();
Model.Collection.AddRange(Collection);
模型保存(文件);
}
}
});
取消=新的委派命令(()=>
{
Collection.Clear();
如果(型号!=null)
{
foreach(Model.Collection中的var项)
{
集合。添加(项目);
}
}
});
浏览=新的DelegateCommand(()=>
{
var open=new Microsoft.Win32.OpenFileDialog();
如果(打开.ShowDialog()??错误)
{
NewUri=open.FileName;
}
});
}
公共ImageCollectionModel模型{get;set;}
公共ObservableCollection集合{get;}=new ObservableCollection();
私有字符串_NewText;
公共字符串新文本
{
获取{return\u NewText;}
set{SetProperty(ref_NewText,value);}
}
私有字符串_NewUri;
公共字符串NewUri
{
获取{return\u NewUri;}
set{SetProperty(ref_NewUri,value);}
}
公共DelegateCommand Add{get;}
公共DelegateCommand Delete{get;}
公共DelegateCommand浏览{get;}
公共DelegateCommand加载{get;}
公共DelegateCommand Save{get;}
公共DelegateCommand Cancel{get;}
}
注意:此示例使用PRISM和c#6.0无法序列化控件,因为它们是视图状态 如果您遵循MVVM,那么您的控件应该显示一个视图模型,该视图模型将操作一个模型,并且该模型是您应该序列化的对象 这里有一个例子 XAML
Uri
添加
删除
取消
拯救
负载
模型
[Serializable]
public class ImageModel
{
public string Text { get; set; }
public Uri Uri { get; set; }
}
public class ImageCollectionModel
{
public List<ImageModel> Collection { get; } = new List<ImageModel>();
private BinaryFormatter Formatter = new BinaryFormatter();
public bool Save(FileInfo file)
{
try
{
using (var stream = file.OpenWrite())
{
Formatter.Serialize(stream, Collection);
return true;
}
}
catch (Exception)
{
return false;
}
}
public bool Load(FileInfo file)
{
try
{
using (var stream = file.OpenRead())
{
var col = Formatter.Deserialize(stream) as List<ImageModel>;
Collection.Clear();
Collection.AddRange(col);
return true;
}
}
catch (Exception)
{
return false;
}
}
}
[可序列化]
公共类图像模型
{
公共字符串文本{get;set;}
公共Uri{get;set;}
}
公共类ImageCollectionModel
{
公共图书馆