2014-07-15 53 views
0

我被一些我無法弄清楚的東西卡住了。列表中的最後一項是覆蓋

我的位圖添加到它當鼠標向下

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) 
{ 
    ChangeHistoryIndex--; 

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

我真的搞不明白。

謝謝。

+2

上的MouseDown添加圖像後,你應該改變ChangeHistoryIndex。 –

+2

備註:撤消堆棧應該通過深層克隆或動作回放來實現。用「List.Add」添加對活動對象的引用不起作用。 –

回答

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

編輯:您正在實施的層疊結構。所以你可以使用堆棧,而不是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; 
    } 
+0

謝謝,但這不會幫助。 – Joery

+1

您還應該使用另一種方法分配ChangeHistoryIndex。 –

+1

這也不起作用。 – Joery