使用现有变量初始化Canvas变量

时间:2013-06-20 10:44:14

标签: c# xaml canvas silverlight-5.0

我正在尝试在Silverlight 5中的Canvas上实现Undo-Redo操作。为此我想在每次操作后将画布保存到堆栈中,并且在撤消或重做操作时,我想用现有的画布替换一个在堆栈中。

面临的问题是,当我将当前画布与temp变量等同时,不会创建新副本,但两个画布变量都引用相同的画布,即一个中完成的更改反映在另一个上。当我更改当前画布然后撤消以替换temp canvas(在执行操作之前等同于当前画布)时,这会产生问题,临时画布也会获得在上一个画布上完成的更改(即当前画布)

如何制作画布的单独副本?请帮忙。

我正在初始化如下:

Canvas temp = new Canvas();
temp = currentCanvas;

1 个答案:

答案 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);