如何使用List在图像编辑应用程序中实现撤消和重做功能?

问题描述 投票:0回答:1

我有一个图像处理应用程序,我打算实现一项功能,让用户撤消和重做图像操作。为此,我选择了一个列表数据结构,当用户执行图像操作时,我将结果位图添加到此列表中。当用户单击撤消按钮时,我所做的就是使用索引返回最后添加到列表中的位图,对于重做,我只返回下一个索引中的位图。该代码在撤消操作中工作,直到到达最后一个索引并返回索引越界异常,尽管使用一些自定义逻辑来处理该异常,检查索引是否小于 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 处的位图?

c# android bitmap
1个回答
0
投票
if(indexer < 0){
//reset
  indexer = 0;
}else{
  indexer -= 1;
}

如果索引为零会发生什么?它不小于零,因此您将减去一,导致索引器为负,从而导致错误。您没有发布您的重做逻辑,但它可能有类似的错误。 请注意,仅保留位图可能会相当限制您可以支持的操作。您通常希望将更改建模为用户可见的修改堆栈,以便用户可以更改参数,而无需撤消和重做所有后续工作。为此,您将需要一个更复杂的撤消/重做模型。

© www.soinside.com 2019 - 2024. All rights reserved.