我正在开发一个WPF应用程序,我必须向最终用户提供一个画布。画布应该有一个工具箱,其中包含矩形,方形等基本形状,可以拖放到画布上。用户完成后,他会点击保存按钮。
现在应该将画布保存到数据库中,并且下次当用户去检索它时,他应该使画布处于他最后一次离开的相同状态,以便他可以继续编辑。 画布代表一个地板,有一些部分,每个部分用基本形状表示。
任何指导意见都将受到赞赏。
答案 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);
}