using Ink_Canvas.Helpers; using System.Windows; using System.Windows.Controls; using System.Windows.Ink; namespace Ink_Canvas { public partial class MainWindow : Window { private enum CommitReason { UserInput, CodeInput, ShapeDrawing, ShapeRecognition, ClearingCanvas, Manipulation } private CommitReason _currentCommitType = CommitReason.UserInput; private bool IsEraseByPoint => inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint; private StrokeCollection ReplacedStroke; private StrokeCollection AddedStroke; private StrokeCollection CuboidStrokeCollection; private TimeMachine timeMachine = new TimeMachine(); private void TimeMachine_OnUndoStateChanged(bool status) { var result = status ? Visibility.Visible : Visibility.Collapsed; BtnUndo.Visibility = result; BtnUndo.IsEnabled = status; } private void TimeMachine_OnRedoStateChanged(bool status) { var result = status ? Visibility.Visible : Visibility.Collapsed; BtnRedo.Visibility = result; BtnRedo.IsEnabled = status; } private void StrokesOnStrokesChanged(object sender, StrokeCollectionChangedEventArgs e) { if (!isHidingSubPanelsWhenInking) { isHidingSubPanelsWhenInking = true; HideSubPanels(); // 书写时自动隐藏二级菜单 } if (_currentCommitType == CommitReason.CodeInput || _currentCommitType == CommitReason.ShapeDrawing) return; if (_currentCommitType == CommitReason.Manipulation) { timeMachine.CommitStrokeManipulationHistory(e.Removed, e.Added); return; } if ((e.Added.Count != 0 || e.Removed.Count != 0) && IsEraseByPoint) { if (AddedStroke == null) AddedStroke = new StrokeCollection(); if (ReplacedStroke == null) ReplacedStroke = new StrokeCollection(); AddedStroke.Add(e.Added); ReplacedStroke.Add(e.Removed); return; } if (e.Added.Count != 0) { if (_currentCommitType == CommitReason.ShapeRecognition) { timeMachine.CommitStrokeShapeHistory(ReplacedStroke, e.Added); ReplacedStroke = null; return; } else { timeMachine.CommitStrokeUserInputHistory(e.Added); return; } } if (e.Removed.Count != 0) { if (_currentCommitType == CommitReason.ShapeRecognition) { ReplacedStroke = e.Removed; return; } else if (!IsEraseByPoint || _currentCommitType == CommitReason.ClearingCanvas) { timeMachine.CommitStrokeEraseHistory(e.Removed); return; } } } } }