C# 列表的最后一项正在覆盖

C# 列表的最后一项正在覆盖,c#,image,list,overwrite,C#,Image,List,Overwrite,我有点搞不懂 当鼠标按下时,我将位图添加到其中 List<Image> ChangeHistory = new List<Image>(); int ChangeHistoryIndex = 0; private void canvas_MouseDown(object sender, MouseEventArgs e) { ChangeHistoryIndex = ChangeHistory.Count - 1; if (canvas.Image !

我有点搞不懂

当鼠标按下时,我将位图添加到其中

List<Image> ChangeHistory = new List<Image>();
int ChangeHistoryIndex = 0;

private void canvas_MouseDown(object sender, MouseEventArgs e)
{
    ChangeHistoryIndex = ChangeHistory.Count - 1;

    if (canvas.Image != null)
    {
        ChangeHistory.Add(canvas.Image);
    }

    MouseIsDown = true;
}
我真的搞不懂


谢谢。

您应该在使用列表后更改索引

private void Undo_Click(object sender, EventArgs e)
{    
    if(ChangeHistoryIndex != -1) 
    {
        canvas.Image = ChangeHistory[ChangeHistoryIndex];
    }
    ChangeHistoryIndex--;
}

编辑:还应在其他方法中指定ChangeHistoryIndex:

private void canvas_MouseDown(object sender, MouseEventArgs e)
{
   if (canvas.Image != null)
   {
       ChangeHistory.Add(canvas.Image);
   }
   ChangeHistoryIndex = ChangeHistory.Count - 1;
   MouseIsDown = true;
}

编辑:您正在实现堆栈结构。因此,您可以使用堆栈而不是列表:

Stack<Image> ChangeHistory = new Stack<Image>();

在鼠标向下添加图像后,应更改ChangeHistoryIndex。旁注:撤消堆栈应通过深度克隆或操作重播来实现。使用
列表添加对活动对象的引用。添加
将不起作用。谢谢,但这不会有帮助。您还应该在另一个方法中分配ChangeHistoryIndex。您成功了吗?
Stack<Image> ChangeHistory = new Stack<Image>();
    private void canvas_MouseDown(object sender, MouseEventArgs e)
    {
        if (canvas.Image != null)
            ChangeHistory.Push(canvas.Image);
        MouseIsDown = true;
    }

    private void Undo_Click(object sender, EventArgs e)
    {
        if (ChangeHistory.Count > 0)
            canvas.Image = ChangeHistory.Pop();
        else
            canvas.Image = null;
    }