簡體   English   中英

如何實現撤消功能?

[英]How to implement undo functionality?

在我的應用程序中,我想為用戶提供一個小的撤消功能。 用戶沒有多少動作可以撤消。 特別是行動是:

  • 添加注釋到對象
  • 為對象着色
  • 使用字符串標記objcet

現在我想到了如何實現這一點。 我首先想到的是一個Action類,它是用戶可以采取的3種不同操作的抽象基類。 每次用戶執行這些操作時,都會創建此抽象Action類的子類的新適當實例,並將其插入包含所有操作的列表中。

每當用戶想要撤消某些內容時,該列表將顯示給用戶,並且他可以選擇要撤消的操作。

現在我在想什么必須存儲在這樣的動作對象中:

  • 在行動之前的對象的狀態
  • 采取的實際操作(例如添加到對象注釋中的字符串)

我不確定這是否足夠。 我還考慮過按時間順序排序,但這應該是必要的,因為列表可以按時間順序保持正確。

還有其他我應該考慮的事情嗎?

撤消/重做通常使用命令模式實現 Action類可以用作此基礎,但您需要在每個命令中執行“執行”操作和“撤消”操作。 這是實踐中的一個例子 您應該存儲在堆棧中執行的命令,因為它使實現更容易,並且用戶更容易遵循。

你可以做這樣簡單的事情:

Stack<Action> undoStack = new Stack<Action>();    

void ChangeColor(Color color)
{
    var original = this.Object.Color;
    undoStack.Push(() => this.Object.Color = original);
    this.Object.Color = color;
}

您應該為要撤消的每個操作實現命令模式

如何在不重大程序更改的情況下實現撤消/重做操作

一切似乎都是正確的,但我寧願使用堆棧而不是列表。 它在時間順序方面很有用。

對於UNDO功能的正確和經過驗證的實現是命令模式

在向現有項目添加撤消/重做功能時,很難忽略這個Simple-Undo-redo-library-for-Csharp-NET

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM