C#undo / redo代码没有做任何事情

时间:2011-06-12 20:31:30

标签: c# winforms stack undo-redo

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

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

但地图不会改变。为什么?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

您的重做和撤消是否引用了不同的堆栈对象?如果它们都引用相同的堆栈对象,那么您的代码只会按下并弹出当前状态。

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

另外,你为什么偷看然后流行?你可以直接弹出到tileMap。