-2

对于我的图块编辑器,我有 2 叠 TileMaps,撤消和重做。每次用户进行更改时,地图的状态都会添加到堆栈中,而不是进行更改。这是我的撤消代码:

private void undoToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (undo.Count != 0)
        {
            redo.Push(tileMap);
            tileMap = undo.Peek();
            undo.Pop();
        }
    }

然而地图并没有改变。为什么?

4

3 回答 3

1

如果 undo 和 redo 只是 Stack 对象,那么什么不会发生。相反,您需要添加代码以在撤消发生时实际更新 UI。在这种情况下,我想您会使用从堆栈中弹出的当前 tileMap 重绘地图。

于 2011-06-12T20:36:51.063 回答
1

我知道这是一个旧线程,但我刚刚遇到了同样的问题。原来我传递给 CurrentItem 的项目与我在内存中编辑的项目相同,所以它只是前后传递同一个对象。

我通过在对象上创建一个克隆函数以返回其自身的新版本来解决这个问题,并且每次执行撤消、重做或添加项功能时,我都会在两个方向上执行此操作。这样,它总是消除对正在编辑的对象的依赖。现在一切正常:)

于 2021-06-28T12:39:13.427 回答
0

如果不是 UI 更新问题...

您的重做和撤消对不同堆栈对象的引用吗?如果它们都引用同一个堆栈对象,那么您的代码只会推送当前状态。

或者类似地,您是在推送对同一个 tileMap 对象的另一个引用,还是它的副本?(即你可能想要Push(tileMap.DeepCopy())

另外,你为什么先Peek然后Pop?您可以直接弹出到 tileMap 中。

于 2011-06-12T21:33:57.737 回答