C# 撤消重做堆栈
我正在使用堆栈制作一个简单的UndoRedo框架,但由于某些原因,有些东西不起作用。 我有这个代码来存储一个对象的属性,在这个例子中是一个ColorBlendC# 撤消重做堆栈,c#,undo-redo,C#,Undo Redo,我正在使用堆栈制作一个简单的UndoRedo框架,但由于某些原因,有些东西不起作用。 我有这个代码来存储一个对象的属性,在这个例子中是一个ColorBlend public static ColorBlend _BG_Blend = new ColorBlend(); public ColorBlend BG_Blend { get { return _BG_Blend; } set { AddLog("BG_Blend", _BG_Blend); //N
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种不同的颜色混合,当我点击Undo时,它会返回存储的属性,但是它们都有相同的颜色,位置都相同。
有人知道为什么吗?在您指定的setter中
_BG_Blend = value;
在getter中,您返回
return _BG_Blend;
因此,是的,无论堆栈中有什么,都将获得最后一个赋值
看起来,在getter中,您需要从堆栈返回值,而不是backing字段值。在您指定的setter中
_BG_Blend = value;
在getter中,您返回
return _BG_Blend;
因此,是的,无论堆栈中有什么,都将获得最后一个赋值
在getter中,似乎需要从堆栈返回值,而不是backing字段值。如果修改
BG\u Blend
并在堆栈中存储对它的引用,堆栈中的所有引用都将指向同一实例。在堆栈中存储实例时,需要创建一个新实例。在更改ColorBlend
之前复制一份副本,并将副本存储在堆栈中。如果修改BG\u Blend
并在堆栈中存储对它的引用,堆栈中的所有引用将指向同一实例。在堆栈中存储实例时,需要创建一个新实例。在更改前复制一份颜色混合
,并将副本存储在堆栈中。问题是,您总是在堆栈中存储相同的对象引用(即\u BG\u混合
),这意味着堆栈中的每个条目都指向相同的对象,更准确地说是您最后插入的对象。对于每个混合,您应该存储一个新的引用。问题是,您总是在堆栈中存储相同的对象引用(即\u BG\u blend
),这意味着堆栈中的每个条目都指向相同的对象,更准确地说是您最后插入的对象。对于每个混合,您应该存储一个新的引用。您的\u BG\u混合
成员变量是静态的
,因此它只有一个实例。每次推送新混合时,都会用新值覆盖静态变量,但由于所有撤消步骤都指向该共享值,因此它们都会被该值“覆盖”
只需删除
static
修饰符。您的\u BG\u Blend
成员变量是static
,因此它只有一个实例。每次推送新混合时,都会用新值覆盖静态变量,但由于所有撤消步骤都指向该共享值,因此它们都会被该值“覆盖”
只需删除
静态
修饰符。您必须显示所有实现。我们无法猜测只有几行代码会出现什么问题。你说的是什么撤销/重做框架?是这个吗:?您必须显示所有的实现。我们无法猜测只有几行代码会出现什么问题。你说的是什么撤销/重做框架?这是一个:?这是由UndoRedoFramework完成的,每次堆栈之一发生更改时,它都会更新parrentobject@user2147134,所以也许。。。您将向我们展示您的所有代码以及如何使用它?我们的水晶球从周一开始离线。这是由UndoRedoFramework完成的,每次堆栈中的一个更改它都会更新parrentobject@user2147134,所以也许。。。您将向我们展示您的所有代码以及如何使用它?我们的水晶球从周一开始下线。