using Ink_Canvas.Helpers; using System; using System.Windows; using System.Windows.Ink; using System.Windows.Media.Imaging; namespace Ink_Canvas { public partial class MainWindow : Window { StrokeCollection[] strokeCollections = new StrokeCollection[101]; bool[] whiteboadLastModeIsRedo = new bool[101]; StrokeCollection lastTouchDownStrokeCollection = new StrokeCollection(); int CurrentWhiteboardIndex = 1; int WhiteboardTotalCount = 1; TimeMachineHistory[][] TimeMachineHistories = new TimeMachineHistory[101][]; //最多99页,0用来存储非白板时的墨迹以便还原 private void SaveStrokes(bool isBackupMain = false) { if (isBackupMain) { var timeMachineHistory = timeMachine.ExportTimeMachineHistory(); TimeMachineHistories[0] = timeMachineHistory; timeMachine.ClearStrokeHistory(); } else { var timeMachineHistory = timeMachine.ExportTimeMachineHistory(); TimeMachineHistories[CurrentWhiteboardIndex] = timeMachineHistory; timeMachine.ClearStrokeHistory(); } } private void ClearStrokes(bool isErasedByCode) { _currentCommitType = CommitReason.ClearingCanvas; if (isErasedByCode) _currentCommitType = CommitReason.CodeInput; inkCanvas.Strokes.Clear(); _currentCommitType = CommitReason.UserInput; } private void RestoreStrokes(bool isBackupMain = false) { try { if (TimeMachineHistories[CurrentWhiteboardIndex] == null) return; //防止白板打开后不居中 if (isBackupMain) { _currentCommitType = CommitReason.CodeInput; timeMachine.ImportTimeMachineHistory(TimeMachineHistories[0]); foreach (var item in TimeMachineHistories[0]) { if (item.CommitType == TimeMachineHistoryType.UserInput) { if (!item.StrokeHasBeenCleared) { foreach (var strokes in item.CurrentStroke) { if (!inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Add(strokes); } } else { foreach (var strokes in item.CurrentStroke) { if (inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Remove(strokes); } } } else if (item.CommitType == TimeMachineHistoryType.ShapeRecognition) { if (item.StrokeHasBeenCleared) { foreach (var strokes in item.CurrentStroke) { if (inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Remove(strokes); } foreach (var strokes in item.ReplacedStroke) { if (!inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Add(strokes); } } else { foreach (var strokes in item.CurrentStroke) { if (!inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Add(strokes); } foreach (var strokes in item.ReplacedStroke) { if (inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Remove(strokes); } } } else if (item.CommitType == TimeMachineHistoryType.Rotate) { if (item.StrokeHasBeenCleared) { foreach (var strokes in item.CurrentStroke) { if (inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Remove(strokes); } foreach (var strokes in item.ReplacedStroke) { if (!inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Add(strokes); } } else { foreach (var strokes in item.CurrentStroke) { if (!inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Add(strokes); } foreach (var strokes in item.ReplacedStroke) { if (inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Remove(strokes); } } } else if (item.CommitType == TimeMachineHistoryType.Clear) { if (!item.StrokeHasBeenCleared) { if (item.CurrentStroke != null) { foreach (var currentStroke in item.CurrentStroke) { if (!inkCanvas.Strokes.Contains(currentStroke)) inkCanvas.Strokes.Add(currentStroke); } } if (item.ReplacedStroke != null) { foreach (var replacedStroke in item.ReplacedStroke) { if (inkCanvas.Strokes.Contains(replacedStroke)) inkCanvas.Strokes.Remove(replacedStroke); } } } else { if (item.ReplacedStroke != null) { foreach (var replacedStroke in item.ReplacedStroke) { if (!inkCanvas.Strokes.Contains(replacedStroke)) inkCanvas.Strokes.Add(replacedStroke); } } if (item.CurrentStroke != null) { foreach (var currentStroke in item.CurrentStroke) { if (inkCanvas.Strokes.Contains(currentStroke)) inkCanvas.Strokes.Remove(currentStroke); } } } } _currentCommitType = CommitReason.UserInput; } } else { _currentCommitType = CommitReason.CodeInput; timeMachine.ImportTimeMachineHistory(TimeMachineHistories[CurrentWhiteboardIndex]); foreach (var item in TimeMachineHistories[CurrentWhiteboardIndex]) { if (item.CommitType == TimeMachineHistoryType.UserInput) { if (!item.StrokeHasBeenCleared) { foreach (var strokes in item.CurrentStroke) { if (!inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Add(strokes); } } else { foreach (var strokes in item.CurrentStroke) { if (inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Remove(strokes); } } } else if (item.CommitType == TimeMachineHistoryType.ShapeRecognition) { if (item.StrokeHasBeenCleared) { foreach (var strokes in item.CurrentStroke) { if (inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Remove(strokes); } foreach (var strokes in item.ReplacedStroke) { if (!inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Add(strokes); } } else { foreach (var strokes in item.CurrentStroke) { if (!inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Add(strokes); } foreach (var strokes in item.ReplacedStroke) { if (inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Remove(strokes); } } } else if (item.CommitType == TimeMachineHistoryType.Rotate) { if (item.StrokeHasBeenCleared) { foreach (var strokes in item.CurrentStroke) { if (inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Remove(strokes); } foreach (var strokes in item.ReplacedStroke) { if (!inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Add(strokes); } } else { foreach (var strokes in item.CurrentStroke) { if (!inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Add(strokes); } foreach (var strokes in item.ReplacedStroke) { if (inkCanvas.Strokes.Contains(strokes)) inkCanvas.Strokes.Remove(strokes); } } } else if (item.CommitType == TimeMachineHistoryType.Clear) { if (!item.StrokeHasBeenCleared) { if (item.CurrentStroke != null) { foreach (var currentStroke in item.CurrentStroke) { if (!inkCanvas.Strokes.Contains(currentStroke)) inkCanvas.Strokes.Add(currentStroke); } } if (item.ReplacedStroke != null) { foreach (var replacedStroke in item.ReplacedStroke) { if (inkCanvas.Strokes.Contains(replacedStroke)) inkCanvas.Strokes.Remove(replacedStroke); } } } else { if (item.ReplacedStroke != null) { foreach (var replacedStroke in item.ReplacedStroke) { if (!inkCanvas.Strokes.Contains(replacedStroke)) inkCanvas.Strokes.Add(replacedStroke); } } if (item.CurrentStroke != null) { foreach (var currentStroke in item.CurrentStroke) { if (inkCanvas.Strokes.Contains(currentStroke)) inkCanvas.Strokes.Remove(currentStroke); } } } } } _currentCommitType = CommitReason.UserInput; } } catch { } } private void BtnWhiteBoardSwitchPrevious_Click(object sender, EventArgs e) { if (CurrentWhiteboardIndex <= 1) return; SaveStrokes(); ClearStrokes(true); CurrentWhiteboardIndex--; RestoreStrokes(); UpdateIndexInfoDisplay(); } private void BtnWhiteBoardSwitchNext_Click(object sender, EventArgs e) { if (Settings.Automation.IsAutoSaveStrokesAtClear && inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber) { SaveScreenShot(true); } if (CurrentWhiteboardIndex >= WhiteboardTotalCount) { BtnWhiteBoardAdd_Click(sender, e); return; } SaveStrokes(); ClearStrokes(true); CurrentWhiteboardIndex++; RestoreStrokes(); UpdateIndexInfoDisplay(); } private void BtnWhiteBoardAdd_Click(object sender, EventArgs e) { if (WhiteboardTotalCount >= 99) return; if (Settings.Automation.IsAutoSaveStrokesAtClear && inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber) { SaveScreenShot(true); } SaveStrokes(); ClearStrokes(true); WhiteboardTotalCount++; CurrentWhiteboardIndex++; if (CurrentWhiteboardIndex != WhiteboardTotalCount) { for (int i = WhiteboardTotalCount; i > CurrentWhiteboardIndex; i--) { TimeMachineHistories[i] = TimeMachineHistories[i - 1]; } } UpdateIndexInfoDisplay(); if (WhiteboardTotalCount >= 99) BtnWhiteBoardAdd.IsEnabled = false; } private void BtnWhiteBoardDelete_Click(object sender, RoutedEventArgs e) { ClearStrokes(true); if (CurrentWhiteboardIndex != WhiteboardTotalCount) { for (int i = CurrentWhiteboardIndex; i <= WhiteboardTotalCount; i++) { TimeMachineHistories[i] = TimeMachineHistories[i + 1]; } } else { CurrentWhiteboardIndex--; } WhiteboardTotalCount--; RestoreStrokes(); UpdateIndexInfoDisplay(); if (WhiteboardTotalCount < 99) BtnWhiteBoardAdd.IsEnabled = true; } private void UpdateIndexInfoDisplay() { TextBlockWhiteBoardIndexInfo.Text = string.Format("{0} / {1}", CurrentWhiteboardIndex, WhiteboardTotalCount); if (CurrentWhiteboardIndex == WhiteboardTotalCount) { BitmapImage newImageSource = new BitmapImage(); newImageSource.BeginInit(); newImageSource.UriSource = new Uri("/Resources/Icons-Fluent/ic_fluent_add_circle_24_regular.png", UriKind.RelativeOrAbsolute); newImageSource.EndInit(); BoardLeftPannelNextPage.Source = newImageSource; BoardRightPannelNextPage.Source = newImageSource; BoardRightPannelNextPageTextBlock.Text = "加页"; BoardLeftPannelNextPageTextBlock.Text = "加页"; } else { BitmapImage newImageSource = new BitmapImage(); newImageSource.BeginInit(); newImageSource.UriSource = new Uri("/Resources/Icons-Fluent/ic_fluent_arrow_circle_right_24_regular.png", UriKind.RelativeOrAbsolute); newImageSource.EndInit(); BoardLeftPannelNextPage.Source = newImageSource; BoardRightPannelNextPage.Source = newImageSource; BoardRightPannelNextPageTextBlock.Text = "下一页"; BoardLeftPannelNextPageTextBlock.Text = "下一页"; } if (CurrentWhiteboardIndex == 1) { BtnWhiteBoardSwitchPrevious.IsEnabled = false; } else { BtnWhiteBoardSwitchPrevious.IsEnabled = true; } if (CurrentWhiteboardIndex == WhiteboardTotalCount) { BtnWhiteBoardSwitchNext.IsEnabled = false; } else { BtnWhiteBoardSwitchNext.IsEnabled = true; } if (WhiteboardTotalCount == 1) { BtnWhiteBoardDelete.IsEnabled = false; } else { BtnWhiteBoardDelete.IsEnabled = true; } } } }