撤消重做堆栈

时间:2013-03-09 22:06:22

标签: c# undo-redo

我正在使用Stacks制作一个简单的UndoRedo框架,但出于某种原因,某些东西无效。 我有这个代码来存储对象的属性,在本例中是一个ColorBlend

public static ColorBlend _BG_Blend = new ColorBlend();
public ColorBlend BG_Blend
{
    get { return _BG_Blend; }
    set
    {
        AddLog("BG_Blend", _BG_Blend); //Name && Property Value
        _BG_Blend = value;                   
    }
}

现在每次更改混合时,都会将新属性存储在堆栈中,并发送一个可以撤消新操作的信号。 如果让我们在日志中说5个不同的ColorBlends,当我点击Undo它返回存储的属性,但它们都有相同的颜色,定位一切。 谁知道为什么?

4 个答案:

答案 0 :(得分:3)

如果你修改 BG_Blend并在堆栈中存储对它的引用,那么堆栈中的所有引用都将指向同一个实例。将它存储在堆栈中时,需要创建一个新实例。在更改之前复制ColorBlend并将副本存储在堆栈中。

答案 1 :(得分:1)

在您指定的设定者中

_BG_Blend = value;                   

在getter中你返回

return _BG_Blend;

所以,是的,无论你的筹码是什么,你都会获得最后指定的值。

看起来在getter中你需要从堆栈中返回值,而不是返回支持字段值。

答案 2 :(得分:1)

问题是你总是在堆栈中存储相同的对象引用(即_BG_Blend),这意味着堆栈中的每个条目都指向同一个对象,更准确地说是最后插入的对象。对于每个混合,您应该存储一个新的参考。

答案 3 :(得分:0)

您的_BG_Blend成员变量为static,因此只有一个实例。每次推送新的混合时,都会用新值覆盖静态变量,但由于所有撤消步骤都只指向此单个共享值,因此它们都会被“覆盖”。

只需删除static修饰符。