InkCanvas的undo / redo命令堆栈

时间:2011-06-16 07:33:08

标签: wpf silverlight-4.0 wpf-controls

我正在使用InkCanvas创建类似应用程序的绘图,我愿意实现撤消 和我的应用程序中的重做功能。

哪种方法可以实现InkCanvas的撤消/重做?

2 个答案:

答案 0 :(得分:4)

我为WPF应用程序实现了undo / redo,最后将我的undo / redo代码发布到http://muf.codeplex.com/。你也可以通过NuGet获得它。只需寻找“MUF”或“Monitored Undo Framework”。它包括对Silverlight 4.0以及.NET 3.5,4.0和WP7的支持。

在我的WPF应用程序中,我们还有一个支持Undo / Redo的InkCanvas。在我的例子中,InkCanvas的笔划与其余数据一起保存到数据库中。我在InkCanvas上挂了各种事件来检测笔画何时发生了变化。然后使用这些事件来更新实体。

实体跟踪笔划的更改并集成到Undo / Redo库中。当用户单击“撤消”时,库会将实体更改回其原始状态。然后我将这些笔划推回到InkCanvas并触发布局更新。

欢迎在codeplex网站(http://muf.codeplex.com/)上提出意见和问题。您还可以在那里找到完整的文档和示例应用程序。

答案 1 :(得分:0)

我知道为时已晚,但是如果只有某人来InkCanvas而不是this answer会有所帮助:

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"/>