WPF保存画布,然后将其从持久状态检索回来



我正在开发一个WPF应用程序,其中我必须向最终用户提供画布。画布应该有一个包含矩形、正方形等基本形状的工具箱,他可以将这些形状拖放到画布上。用户完成后,他将单击保存按钮。

画布现在应该保存到数据库中,下次用户检索时,他应该使画布处于上次离开的状态,以便继续编辑。画布代表一个地板,地板上有多个部分,每个部分都由一个基本形状表示。

如有任何指导,我们将不胜感激。

@Rachit,我可能错了,但你似乎没有抓住要点。这一点是,你不应该保存UI元素,你应该保存显示为UI元素的数据。

必须已经有包含Canvas上形状的位置、颜色和类型的数据对象。。。这是您应该保存的内容,而不是实际的XAML。使用Serialization,这是一个非常简单的过程。您可以按照"如何将可序列化对象保存到文件/从文件还原可序列化对象?"中的答案进行操作?问题

现在可以使用XamlWriter.Save方法直接保存XAML了。让我们假设一下你真的这么做了。。。所以您现在有一个保存的文件,其中包含一些XAML。现在怎么办?即使您设法在视图模型或代码隐藏中重新加载了Canvas(这真的不应该知道任何关于UI的信息),那么您会怎么做呢?

你手里可能有一个Canvas,但你已经没有数据了。如果用户想要移动对象,该怎么办?你没有数据,所以你不能。现在,如果您保存了数据,那么Canvas可以随时重新渲染。这就是为什么需要保存数据而不是UI控件的原因之一。

如果你看看我对这个关于编写WPF国际象棋应用程序的问题的回答,你会发现如何使用数据驱动模型创建一个包含各种元素的画布。然后,您可以使用标准的C#序列化将数据序列化到所需的任何持久存储中。

保存位于WPF表单中的画布mainImageCanvas

FileStream fs = File.Open("fileName.xaml", FileMode.Create);
XamlWriter.Save(mainImageCanvas, fs);
fs.Close();

将保存的画布读取到mainImageCanvas:

FileStream fs = File.Open("fileName.xaml", FileMode.Open, FileAccess.Read);
Canvas savedCanvas = XamlReader.Load(fs) as Canvas;
fs.Close();
while (savedCanvas.Children.Count > 0)
{
UIElement uie = savedCanvas.Children[0];
savedCanvas.Children.Remove(uie);
mainImageCanvas.Children.Add(uie);
}

最新更新