用现有的Canvas变量初始化一个Canvas变量

本文关键字:Canvas 变量 一个 初始化 | 更新日期: 2023-09-27 18:19:23

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

面临的问题是,当我将当前画布与临时变量等同起来时,不会产生新的副本,但两个画布变量都指向同一个画布,即在一个中所做的更改会反映在另一个中。这就产生了问题,当我改变当前画布,然后撤消替换临时画布(这是相当于当前画布之前的操作执行),临时画布也得到的变化是在以前的画布上完成的(即。当前画布)。

我如何使单独的副本的画布??请帮助。

初始化如下:

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

用现有的Canvas变量初始化一个Canvas变量

在完整的。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的这个泛型类来克隆一个silverlight对象,如下所示:

CloneObject.DeepClone<Canvas>(source,true);