列表的最后一项是覆盖

本文关键字:一项 覆盖 最后 列表 | 更新日期: 2023-09-27 18:13:15

我被一件我想不明白的事情卡住了。

当鼠标按下时,我给它添加了位图

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;
}

这是Undo按钮事件,如果点击了,ChangeHistory中的所有项都是相同的。

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

我实在想不明白。

谢谢。

列表的最后一项是覆盖

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

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代替List:

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

并在您的事件中使用PushPop方法,如下所示:

    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;
    }