WPF保存画布,然后从持久状态检索它

时间:2014-01-07 10:22:34

标签: c# sql-server wpf canvas

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

现在应该将画布保存到数据库中,并且下次当用户去检索它时,他应该使画布处于他最后一次离开的相同状态,以便他可以继续编辑。 画布代表一个地板,有一些部分,每个部分用基本形状表示。

任何指导意见都将受到赞赏。

3 个答案:

答案 0 :(得分:4)

@Rachit,我可能错了,但你似乎在这里忽略了这一点。这一点是你不应该保存UI元素,你应该保存显示为UI元素的数据。

必须已经有数据对象,其中包含Canvas上的形状的位置,颜色和类型......这是你应该保存的,而不是实际的XAML 。使用Serialization,这是一个非常简单的过程。您可以按照How to save/restore serializable object to/from file?问题中的答案进行操作。

现在 可以使用XamlWriter.Save Method直接保存XAML。让我们假设你实际上已经做了一分钟...所以你现在有一个包含一些XAML的保存文件。现在怎么办?即使您设法在视图模型或后面的代码中重新加载Canvas(实际上对UI没有任何了解),那么您会做什么?

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

答案 1 :(得分:0)

如果查看我对this question about writing a WPF chess application的回答,那么您将看到如何使用数据驱动模型创建包含各种元素的画布。然后,您可以使用standard C# serialization将该数据序列化为所需的任何持久存储。

答案 2 :(得分:0)

保存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);
}