стек команд отмены / повтора для InkCanvas - PullRequest
3 голосов
/ 16 июня 2011

Я создаю приложение, подобное рисованию, с использованием InkCanvas, и я хочу реализовать в своем приложении функции отмены и повтора.

Какой лучший способ реализовать отмену / повтор для InkCanvas ??

Ответы [ 2 ]

4 голосов
/ 21 июня 2011

Я реализовал отмену / повтор для приложения WPF и в итоге опубликовал свой код отмены / возврата в http://muf.codeplex.com/. Вы также можете получить его через NuGet.Просто найдите «MUF» или «Monitored Undo Framework».Он включает поддержку Silverlight 4.0, а также .NET 3.5, 4.0 и WP7.

В моем приложении WPF у нас также был InkCanvas, который поддерживал Undo / Redo.В моем случае штрихи для InkCanvas были сохранены в базе данных с остальными данными.Я подключил различные события на InkCanvas, чтобы определить, когда изменились штрихи.Затем использовали эти события для обновления сущностей.

Объекты отслеживали изменения штрихов и интегрировали в библиотеку Undo / Redo.Когда пользователь нажимает Отменить, библиотека возвращает сущности обратно в исходное состояние.Затем я вставляю эти штрихи обратно в InkCanvas и запускаю обновление макета.

Комментарии и вопросы приветствуются на сайте codeplex (http://muf.codeplex.com/).Там же вы найдете полную документацию и примеры приложений.

0 голосов
/ 21 октября 2018

Я знаю, что уже слишком поздно, но если кто-то здесь для InkCanvas только чем , этот ответ может помочь:

public partial class MainWindow : Window
{
    System.Windows.Ink.StrokeCollection _added;
    System.Windows.Ink.StrokeCollection _removed;
    private bool handle = true;
    public MainWindow()
    {
        InitializeComponent();
        inkCanvas1.Strokes.StrokesChanged += Strokes_StrokesChanged;
    }

    private void Strokes_StrokesChanged(object sender, System.Windows.Ink.StrokeCollectionChangedEventArgs e)
    {
        if(handle)
        {
            _added = e.Added;
            _removed = e.Removed;
        }
    }


    private void Undo(object sender, RoutedEventArgs e)
    {
        handle = false;
        inkCanvas1.Strokes.Remove(_added);
        inkCanvas1.Strokes.Add(_removed);
        handle = true;
    }

    private void Redo(object sender, RoutedEventArgs e)
    {
        handle = false;
        inkCanvas1.Strokes.Add(_added);
        inkCanvas1.Strokes.Remove(_removed);
        handle = true;
    }
}

И в XAML:

<InkCanvas x:Name="inkCanvas1" Width="100" Height="100" Background="Yellow"/>
<Button Content="Undo" Click="Undo" />
<Button Content="Redo" Click="Redo"/>
...