Вопрос

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

  • Добавление заметок к объекту
  • Раскрасьте объект
  • Пометьте 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 при добавлении функций отмены / повтора в существующие проекты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top