对于我的磁贴编辑器,我有2堆TileMaps,undo和redo。每次用户进行更改时,地图的状态都会添加到堆栈中,而不是进行更改。这是我的撤消代码:
private void undoToolStripMenuItem_Click(object sender, EventArgs e)
{
if (undo.Count != 0)
{
redo.Push(tileMap);
tileMap = undo.Peek();
undo.Pop();
}
}
但地图不会改变。为什么?
答案 0 :(得分:1)
如果undo和redo只是Stack对象,那么应该不会发生。相反,您需要添加代码以在撤消发生时实际更新UI。在这种情况下,我想你会使用从弹出堆栈的当前tileMap重绘地图。
答案 1 :(得分:1)
我知道这是一个旧线程,但我刚刚遇到了同样的问题。结果我传递给 CurrentItem 的项目与我在内存中编辑的项目相同,所以它只是来回传递同一个对象。
我通过在对象上创建一个 Clone 函数来返回其自身的新版本来解决这个问题,并且每次在两个方向执行撤消、重做或 additem 函数时我都会这样做。这样,它总是消除对正在编辑的对象的依赖。现在一切正常:)
答案 2 :(得分:0)
如果它不是UI更新问题......
您的重做和撤消是否引用了不同的堆栈对象?如果它们都引用相同的堆栈对象,那么您的代码只会按下并弹出当前状态。
或者类似地,您是否正在推送对同一tileMap对象的另一个引用,或者复制? (即你可能想要Push(tileMap.DeepCopy())
)
另外,你为什么偷看然后流行?你可以直接弹出到tileMap。