当前位置: 首页 > 编程语言 > C#

Windows8:如何使用内置的墨迹功能来撤销和重做墨迹?分享

时间:2023-04-11 11:20:40 C#

Windows8:如何使用内置墨迹功能撤消和重做墨迹?基于微软的简化墨水示例,我在我的应用程序中实现了墨水代码:http://code.msdn.microsoft.com/windowsapps/Input-simplified-ink-sample-11614bbf/view/SourceCode首先,我创建了一个类(draw/delete/clear)保存操作数据,如下:publicenumeInkOperation{Draw,Delete,None}publicclassInkOperation{publicInkStrokeStroke{get;放;}//绘图需要从undopubliceInkOperationOperation{get;放;}publicInkOperation(InkStrokestroke,eInkOperationinkOperation){Stroke=stroke.Clone();//需要克隆AddStroke才能工作Operation=inkOperation;然后我为undoink操作创建了一个stack,为redo操作创建了一个stack//stackofnormaloperationsStack_undoStack=newStack();//撤消操作会将它们从撤消堆栈中弹出并将它们推入重做堆栈Stack_redoStack=newStack();当用户撤消笔划时,我将其推入重做堆栈并使用以下命令将其从inkmanager中删除:privatevoidRedoStackPush(InkOperationinkOperation){inkOperation.Stroke=inkO操作.Stroke.Clone();_redoStack.Push(inkOperation);}privatevoidDeleteStroke(InkStrokestroke){stroke=inkManager.GetStrokes().Last();中风.Selected=true;inkManager.DeleteSelected();然后,当用户点击重做时,笔划将从重做堆栈中弹出并使用此方法绘制:inkManager.AddStroke(描边);}renderer.Clear();//此渲染器对象平滑笔画//并将它们作为路径对象添加到所需的控件(网格等)renderer.AddInk(inkManager.GetStrokes());这一切都有效,笔划显示在网格上但是,当我尝试擦除新重新绘制的笔划时,我得到以下异常:AccessViolationException:Attemptedtoreadorwriteprotectedmemory。这通常表明其他内存已损坏。这发生在:publicvoidPointerMoved(PointerRoutedEventArgse){try{varpointerPoint=e.GetCurrentPoint(_inkingArea);varpointerEventType=InkHelpers.GetPointerEventType(e);if(pointerId==(int)pointerPoint.PointerId){switch(inkManager.Mode){caseInkManipulationMode.Inking:caseInkManipulationMode.Selecting://处理中间点varintermediatePoints=e.GetIntermediatePoints(_inkingArea);对于(inti=intermediatePoints.Count-1;i>=0;i--){inkManager.ProcessPointerUpdate(intermediatePoints[i]);}//实时渲染renderer.UpdateLiveRender(pointerPoint);休息;caseInkManipulationMode.Erasing://检查是否有东西被擦除//在擦除模式InkManager.ProcessPointerUpdate返回一个无效的矩形://如果它没有退化,一些东西已经被擦除rased//在擦除模式下不要打扰处理中间点//如果inkManager.ProcessPointerUpdate抛出异常,它会崩溃应用程序,无论是否有任何捕获RectinvalidateRect=(Rect)inkManager.ProcessPointerUpdate(e.GetCurrentPoint(_inkingArea));if(invalidateRect.Height!=0&&invalidateRect.Width!=0){//我们不知道什么被擦除所以我们清除渲染//并添加回墨水管理器中保存的所有墨水renderer.Clear();varremainingStrokes=inkManager.GetStrokes();renderer.AddInk(remainingStrokes);}休息;默认值:中断;}}}catch(Exception){}}在这一行中:RectinvalidateRect=(Rect)inkManager.ProcessPointerUpdate(e.GetCurrentPoint(_inkingArea));我认为问题在于向墨迹管理器添加笔划的过程我尝试创建一个新笔划,甚至从InkStroke继承以使其可自定义,但InkStroke类是密封的,它没有构造函数。我发现唯一可以复制它的方法是执行inkStroke.Clone()。但是,甚至在尝试重绘已删除的墨迹(撤消已删除的笔画)时也会出现此问题。我试图用最少的代码使这一点尽可能清楚以避免混淆,所以如果还不够请告诉我。同样在这个问题中,我专注于撤消绘图操作。撤消删除操作(甚至“清除所有”操作)有其自身的一系列问题,因为我无法复制InkStroke对象。提前感谢您的时间和考虑。从MSDN查看此线程,它可能会有所帮助。以上是C#学习教程:Windows8:如何使用内置的墨迹功能来撤销和重做墨迹?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: