Как реализовать функцию отмены?

В моем приложении я хочу предоставить пользователю небольшую функцию отмены. Не так много действий, которые пользователь может отменить. В частности, действиями являются:

  • Добавить примечания к объекту
  • Раскрасьте объект
  • Пометьте объект строкой

Теперь подумал, как это реализовать. Сначала я подумал о классе действий, который является абстрактным базовым классом для трех различных действий, которые может выполнять пользователь. Каждый раз, когда пользователь выполняет эти действия, создается новый соответствующий экземпляр подкласса этого абстрактного класса Action, который вставляется в список, содержащий все действия.

Когда пользователь хочет что-то отменить, ему отображается список, и он может выбрать, какое действие он хочет отменить.

Теперь я подумал, что нужно сохранить в таком объекте действия:

  • состояние объекта перед действием
  • фактическое действие, которое было предпринято (например, строка, которая была добавлена ​​в примечания к объекту)

Я не уверен, что этого достаточно. Я также подумал о чем-то вроде хронологического упорядочивания, но это должно быть необходимо, поскольку список можно поддерживать в хронологическом порядке.

Есть ли еще что-нибудь, что мне следует рассмотреть?


person Community    schedule 13.12.2010    source источник
comment
Найдите образец сувенира в GOF   -  person pastjean    schedule 13.12.2010


Ответы (5)


Отменить / повторить действие обычно можно с помощью шаблона команд. Класс Action может использоваться в качестве основы для этого, но вам потребуется действие «выполнить» и действие «отменить» в каждой команде. Вот пример этого в упражняться. Вам, вероятно, следует хранить выполняемые команды в стеке, поскольку это значительно упрощает реализацию и облегчает пользователю выполнение действий.

person Dr Herbie    schedule 13.12.2010

Вы можете сделать что-нибудь простое:

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;
}
person ChaosPandion    schedule 13.12.2010
comment
Мне нравится этот. Никогда не думал о хранении реальных действий ... очень хорошо. - person Chris Pfohl; 15.12.2010

вам следует реализовать шаблон команды для каждого действия, которое вы хотите отменить:

как реализовать операцию отмены / повтора без серьезных изменений в программе

person ArBR    schedule 13.12.2010

Для правильной и проверенной реализации функциональности UNDO используется шаблон команд.

person TalentTuner    schedule 13.12.2010

Трудно не заметить это Simple-Undo-redo- library-for-Csharp-NET при добавлении функций Undo / Redo в существующие проекты.

person Jeremy Thompson    schedule 17.05.2013