我有一个图像处理应用程序,我打算实现一项功能,让用户撤消和重做图像操作。为此,我选择了一个列表数据结构,当用户执行图像操作时,我将结果位图添加到此列表中。当用户单击撤消按钮时,我所做的就是使用索引返回最后添加到列表中的位图,对于重做,我只返回下一个索引中的位图。该代码在撤消操作中工作,直到到达最后一个索引并返回索引越界异常,尽管使用一些自定义逻辑来处理该异常,检查索引是否小于 0 并将其重置为 0。当用户尝试重做列表中的最后一项。 以下是我的代码,提前致谢。
//in class declaration of the list object
private List<Bitmap> Queue = new List<Bitmap>() ;
//index to help the user perform undo and redo operations
private int indexer = 0;
上面声明的索引已更新为指向列表中的最后一个位图,如下所示
//image operation
//add image to list
Queue.Add(bitmap);
//point to the last image in the list
indexer = Queue.Count-1;
现在执行撤消操作的事件处理程序如下所示。
case Resource.Id.action_do:
//check if the lost contains at least one image
if(Queue.Count > 0){
//handle undo past 0
if(indexer < 0){
//reset
indexer = 0;
}else{
indexer -= 1;
}
//update the image to UI
var bmp = Queue.ElementAt(indexer);
pictureBox1.SetImageBitmap(bmp);
}
break;
如果用户试图重做集合上最后一个位图,如何让它返回索引 0 处的位图?
if(indexer < 0){
//reset
indexer = 0;
}else{
indexer -= 1;
}
如果索引为零会发生什么?它不小于零,因此您将减去一,导致索引器为负,从而导致错误。您没有发布您的重做逻辑,但它可能有类似的错误。 请注意,仅保留位图可能会相当限制您可以支持的操作。您通常希望将更改建模为用户可见的修改堆栈,以便用户可以更改参数,而无需撤消和重做所有后续工作。为此,您将需要一个更复杂的撤消/重做模型。