InkCanvas的撤销/重做命令堆栈

3

我正在使用InkCanvas创建类似于绘画的应用程序,我想在我的应用程序中实现撤销和重做功能。

最好的实现方法是什么?如何为InkCanvas实现撤销/重做功能?

3个回答

4
我已经为WPF应用程序实现了撤消/恢复功能,并将我的撤消/恢复代码发布到http://muf.codeplex.com/。您也可以通过NuGet获取它。只需搜索"MUF"或"Monitored Undo Framework"即可。它包括对Silverlight 4.0的支持,以及.NET 3.5、4.0和WP7。
在我的WPF应用程序中,我们还有一个支持撤消/恢复的InkCanvas。在我的情况下,InkCanvas的笔画与其他数据一起保存到数据库中。我挂钩了InkCanvas上的各种事件,以便检测笔画何时发生变化。然后使用这些事件来更新实体。
实体跟踪笔画的更改并集成到了撤消/恢复库中。当用户单击撤消时,库会将实体改回其原始状态。然后我将这些笔画推回InkCanvas并触发布局更新。
欢迎在codeplex网站(http://muf.codeplex.com/)上发表评论和提问。您还可以在那里找到完整的文档和示例应用程序。

这个库非常好!如果您能提供它在InkCanvas中的使用方法就更好了。例如:var undoRoot = UndoService.Current[this.inkCanvas]。 - Vasyl Boroviak
1
嗨,MUF 很难使用。我无法正确运行一个简单的撤销/重做代码。 Codeplex 需要更多的示例,而且不像你的照片应用或单元测试那样复杂。您应该为用户提供最简单的示例以让 MUF 正常工作。 - Vasyl Boroviak
@VasiliyBorovyak 我很乐意提供帮助。请在Codeplex网站上发布问题,我会在那里继续讨论。 - NathanAW

2

我知道现在可能有些晚了,但是如果有人只关注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"/>

0

我不知道这是否有帮助.. 但是一个非常简单的撤销方法是:UNDO

YourWindow.xaml.cs

 private void Undo_Click(object sender, RoutedEventArgs e)
        {
            if (YourInkCanva.Strokes.Count > 0)
            {
                YourInkCanva.Strokes.RemoveAt(YourInkCanva.Strokes.Count - 1);
            }
            else
            {
                // Else Do Nothing.
            }
        }
  • 您需要将YourInkCanva替换为您的inkcanva名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接