我一直在研究涉及移動多種形狀的WPF應用程序。它主要是MVVM並嚴重依賴於命令。直到最近,我還沒有擔心撤銷/重做。我認爲這不會太困難,因爲我的大部分更改都涉及繼承實現ICommand的基類CommandBase的命令。使用命令模式和ICommand對撤銷/重做進行參數跟蹤。存儲多個命令?
到目前爲止,我添加了另一個名爲IUndoCommand的接口,它使用ICommand。我添加了一個Undo方法,可以執行撤消操作時所需的操作。
我將爲撤銷和重做使用堆棧,但我遇到了Execute/Undo方法的參數問題。有沒有一種合適的方式來存儲這些類型對象的參數?向IUndoCommand添加字段/方法是否明智?如果是的話,我應該將它設置在Execute方法或構造函數中(如果我甚至可以)。
如果不是,我應該將它作爲堆棧中自己的對象傳遞給它?其次,(儘管這可能是它自己的問題)是否有更好的數據結構來跟蹤多個命令?我目前有一個循環運行多個命令來移動多個選定的形狀,並希望允許一個撤銷全部撤消它們。我想我可以將它轉換爲自己的命令並將命令傳遞給它,但是我又是新手,寧願做正確的事情。
感謝您的閱讀和任何幫助將不勝感激。
來源:
Code Project VisualStudioMagazine StackOverFlow
你看的時代報設計模式?這是專門用於撤消的目的。正如你對隊列所做的那樣,重做只是模式的反轉。 http://en.wikipedia.org/wiki/Memento_pattern –
我看到了,這是我最初開始工作。我覺得這樣可以給我更多的控制權,而且我已經做得更好。我有一個DrawingEditViewModel設置爲我的datacontext。這有可觀察的與模型交互的視圖模型集合。它還會跟蹤我的內容寬度/高度和消息(因爲存在縮放)。我可以將寬度/高度/縮放移動到另一個類,但仍然需要訪問它。 –
這是一個問題,因爲在設計模式中最簡單的解決方案是整個視圖模型的深度複製是正確的?這會導致放大/縮小變化被保存爲一個非常煩人的步驟。用戶必須控制+ z 8次才能回到最後的視圖位置。我希望這是有道理的.. –