我正在使用InkCanvas创建类似应用程序的绘图,我愿意实现撤消 和我的应用程序中的重做功能。
哪种方法可以实现InkCanvas的撤消/重做?
答案 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"/>