我正在使用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它返回存储的属性,但它们都有相同的颜色,定位一切。 谁知道为什么?
答案 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
修饰符。