【问题标题】:Undo Redo StackUndo Redo Stack
【发布时间】:2013-02-25 07:45:13
【问题描述】:

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

【问题讨论】:

  • 你将不得不展示你所有的实现。仅仅几行代码,我们无法猜测问题出在哪里。
  • 你在说什么撤销/重做框架?是这个吗:codeproject.com/Articles/19550/…

标签: c# undo-redo


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      在你指定的 setter 中

      _BG_Blend = value;                   
      

      在你返回的吸气剂中

      return _BG_Blend;
      

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

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

      【讨论】:

      • 这是由 UndoRedoFramework 完成的,每次堆栈之一更改它都会更新父对象
      • @user2147134,所以也许......你会向我们展示你所有的代码以及你是如何使用它的?我们的水晶球从星期一开始离线。
      【解决方案4】:

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

      只需删除 static 修饰符即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-21
        • 1970-01-01
        • 1970-01-01
        • 2012-10-30
        • 2010-12-22
        • 1970-01-01
        • 2013-02-07
        • 1970-01-01
        相关资源
        最近更新 更多