列表的最后一项是覆盖

时间:2014-07-15 17:53:30

标签: 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 != null)
    {
        ChangeHistory.Add(canvas.Image);
    }

    MouseIsDown = true;
}

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

private void Undo_Click(object sender, EventArgs e)
{
    ChangeHistoryIndex--;

    if(ChangeHistoryIndex != 0) 
    {
        canvas.Image = ChangeHistory[ChangeHistoryIndex];
    }
}

我真的无法理解。

感谢。

1 个答案:

答案 0 :(得分:1)

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

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