我正在尝试在Silverlight 5中的Canvas上实现Undo-Redo操作。为此我想在每次操作后将画布保存到堆栈中,并且在撤消或重做操作时,我想用现有的画布替换一个在堆栈中。
面临的问题是,当我将当前画布与temp变量等同时,不会创建新副本,但两个画布变量都引用相同的画布,即一个中完成的更改反映在另一个上。当我更改当前画布然后撤消以替换temp canvas(在执行操作之前等同于当前画布)时,这会产生问题,临时画布也会获得在上一个画布上完成的更改(即当前画布)
如何制作画布的单独副本?请帮忙。
我正在初始化如下:
Canvas temp = new Canvas();
temp = currentCanvas;
答案 0 :(得分:1)
在完整的.Net框架中,您可以使用XamlReader和-Writer创建克隆:
public Canvas Clone(Canvas source)
{
var savedObj = XamlWriter.Save(source);
var reader = new StringReader(savedObj);
var xmlReader = XmlReader.Create(reader);
var canvas = (Canvas)XamlReader.Load(xmlReader);
return canvas;
}
编辑: 由于silverlight不支持XamlWriter和Reader,因此可以使用this generic class by Jim McCurdy克隆sliverlight对象,如下所示:
CloneObject.DeepClone<Canvas>(source,true);