列表的最后一项是覆盖
本文关键字:一项 覆盖 最后 列表 | 更新日期: 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>();
并在您的事件中使用Push
和Pop
方法,如下所示:
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;
}