From d7faac257c2caeeb5085db3b2bf1ba214b9eddfc Mon Sep 17 00:00:00 2001 From: CJKmkp Date: Sun, 26 Apr 2026 04:19:30 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20WinRT=20Ink=20Analysis=20=E6=80=A7?= =?UTF-8?q?=E8=83=BD=E4=BC=98=E5=8C=96=E9=87=8D=E6=9E=84=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: traeagent --- Ink Canvas/Helpers/WinRtInkShapeRecognizer.cs | 57 ++++++------------- .../MW_SimulatePressure&InkToShape.cs | 6 +- 2 files changed, 21 insertions(+), 42 deletions(-) diff --git a/Ink Canvas/Helpers/WinRtInkShapeRecognizer.cs b/Ink Canvas/Helpers/WinRtInkShapeRecognizer.cs index 93a70ae5..8ad74c69 100644 --- a/Ink Canvas/Helpers/WinRtInkShapeRecognizer.cs +++ b/Ink Canvas/Helpers/WinRtInkShapeRecognizer.cs @@ -17,48 +17,16 @@ namespace Ink_Canvas.Helpers public static readonly Guid ShapeStrokePropertyGuid = new Guid("11111111-2222-3333-4444-555555555555"); private global::Windows.UI.Input.Inking.Analysis.InkAnalyzer _internalAnalyzer; - private readonly StrokeCollection _strokeContainer; private readonly Dictionary _strokeIdMap = new Dictionary(); private readonly Dictionary _reverseIdMap = new Dictionary(); private readonly object _syncLock = new object(); - public ModernInkAnalyzer(StrokeCollection container) + public ModernInkAnalyzer() { if (!WinRtInkShapeRecognizer.IsApiAvailable) return; _internalAnalyzer = new global::Windows.UI.Input.Inking.Analysis.InkAnalyzer(); - _strokeContainer = container; - _strokeContainer.StrokesChanged += OnStrokesChanged; - - // Initial sync - foreach (var stroke in _strokeContainer) - { - AddStrokeInternal(stroke); - } - } - - private void OnStrokesChanged(object sender, StrokeCollectionChangedEventArgs e) - { - if (_internalAnalyzer == null) return; - - lock (_syncLock) - { - foreach (var stroke in e.Added) - { - AddStrokeInternal(stroke); - } - - foreach (var stroke in e.Removed) - { - if (_strokeIdMap.TryGetValue(stroke, out var id)) - { - _internalAnalyzer.RemoveDataForStroke(id); - _strokeIdMap.Remove(stroke); - _reverseIdMap.Remove(id); - } - } - } } private void AddStrokeInternal(Stroke stroke) @@ -80,9 +48,9 @@ namespace Ink_Canvas.Helpers private CancellationTokenSource _cts; - public async Task AnalyzeAsync() + public async Task AnalyzeAsync(StrokeCollection strokes) { - if (_internalAnalyzer == null) + if (_internalAnalyzer == null || strokes == null || strokes.Count == 0) return InkShapeRecognitionResult.Empty; _cts?.Cancel(); @@ -91,6 +59,21 @@ namespace Ink_Canvas.Helpers try { + lock (_syncLock) + { + _internalAnalyzer.ClearDataForAllStrokes(); + _strokeIdMap.Clear(); + _reverseIdMap.Clear(); + + foreach (var stroke in strokes) + { + AddStrokeInternal(stroke); + } + } + + if (_strokeIdMap.Count == 0) + return InkShapeRecognitionResult.Empty; + var result = await _internalAnalyzer.AnalyzeAsync().AsTask(token).ConfigureAwait(true); if (token.IsCancellationRequested) return InkShapeRecognitionResult.Empty; @@ -147,10 +130,6 @@ namespace Ink_Canvas.Helpers public void Dispose() { - if (_strokeContainer != null) - { - _strokeContainer.StrokesChanged -= OnStrokesChanged; - } _internalAnalyzer = null; } } diff --git a/Ink Canvas/MainWindow_cs/MW_SimulatePressure&InkToShape.cs b/Ink Canvas/MainWindow_cs/MW_SimulatePressure&InkToShape.cs index e12d2299..a81d2ada 100644 --- a/Ink Canvas/MainWindow_cs/MW_SimulatePressure&InkToShape.cs +++ b/Ink Canvas/MainWindow_cs/MW_SimulatePressure&InkToShape.cs @@ -31,8 +31,8 @@ namespace Ink_Canvas public partial class MainWindow : Window { private Helpers.ModernInkAnalyzer _modernInkAnalyzer; - private Helpers.ModernInkAnalyzer ModernInkAnalyzer => - _modernInkAnalyzer ??= new Helpers.ModernInkAnalyzer(inkCanvas.Strokes); + private Helpers.ModernInkAnalyzer ModernInkAnalyzer => + _modernInkAnalyzer ??= new Helpers.ModernInkAnalyzer(); /// /// 存储新的笔画集合,用于形状识别 @@ -626,7 +626,7 @@ namespace Ink_Canvas if (ShapeRecognitionRouter.ResolveUseWinRt(shapeMode) && Helpers.WinRtInkShapeRecognizer.IsApiAvailable) { - result = await ModernInkAnalyzer.AnalyzeAsync(); + result = await ModernInkAnalyzer.AnalyzeAsync(newStrokes); } else {