0

我正在使用 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 种不同的 ColorBlend,当我点击 Undo 时,它会返回存储的属性,但它们都具有相同的颜色,定位所有内容。有谁知道为什么?

4

4 回答 4

3

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

于 2013-03-09T22:16:03.380 回答
1

在你分配的二传手

_BG_Blend = value;                   

在你返回的吸气剂中

return _BG_Blend;

所以,是的,无论堆栈中有什么,您都将获得最后一个分配的值。

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

于 2013-03-09T22:10:04.170 回答
1

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

于 2013-03-09T22:17:12.537 回答
0

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

只需删除static修饰符。

于 2013-03-09T22:28:14.763 回答