Как реализовать функцию отмены?
-
09-10-2019 - |
Вопрос
В моем приложении я хочу предоставить пользователю небольшую функцию отмены.Существует не так много действий, которые могут быть отменены пользователем.В частности, к таким действиям относятся:
- Добавление заметок к объекту
- Раскрасьте объект
- Пометьте objcet строкой
Теперь я задумался о том, как это реализовать.Сначала я подумал о классе действий, который является абстрактным базовым классом для 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;
}
вы должны реализовать следующее Шаблон команды для каждого действия, которое вы хотите отменить:
как реализовать операцию отмены / повтора без существенных изменений в программе
Все кажется правильным, но я бы предпочел использовать stack, а не list.Это будет полезно в аспекте хронологического упорядочения.
Для правильной и проверенной реализации функции ОТМЕНЫ используется командный шаблон
Это трудно не заметить Простая-Отмена-повтора-библиотеки-для-Csharp-NET при добавлении функций отмены / повтора в существующие проекты.