0

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

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

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

我正在初始化如下:

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

1 回答 1

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,您可以使用Jim McCurdy 的这个泛型类来克隆 sliverlight 对象,如下所示:

CloneObject.DeepClone<Canvas>(source,true);
于 2013-06-20T10:53:03.303 回答