Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使C#WPF ContentControl可序列化?_C#_Wpf - Fatal编程技术网

如何使C#WPF ContentControl可序列化?

如何使C#WPF ContentControl可序列化?,c#,wpf,C#,Wpf,我需要序列化包含图像和文本框的ContentControl列表,以便将它们保存到二进制文件中 错误消息 程序集“PresentationFramework,版本=4.0.0.0,区域性=中性,PublicKeyToken=31bf3856ad364e35”中的类型“System.Windows.Controls.ContentControl”未标记为可序列化。“ 无法序列化控件,因为它们是视图状态 如果您遵循MVVM,那么您的控件应该显示一个视图模型,该视图模型将操作一个模型,并且该模型是您应该

我需要序列化包含图像和文本框的ContentControl列表,以便将它们保存到二进制文件中

错误消息

程序集“PresentationFramework,版本=4.0.0.0,区域性=中性,PublicKeyToken=31bf3856ad364e35”中的类型“System.Windows.Controls.ContentControl”未标记为可序列化。“


无法序列化控件,因为它们是视图状态

如果您遵循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
{
公共图书馆