From 415df555c73cf73f28079766e44d12e7fc33531c Mon Sep 17 00:00:00 2001 From: ww-rm Date: Mon, 8 Sep 2025 21:50:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=BC=E5=85=A5=E5=90=8E?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E9=80=89=E4=B8=AD=E6=9C=80=E5=90=8E=E4=B8=80?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MainWindow/SpineObjectListViewModel.cs | 32 +++++++++++++++++++ SpineViewer/Views/MainWindow.xaml.cs | 4 +-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/SpineViewer/ViewModels/MainWindow/SpineObjectListViewModel.cs b/SpineViewer/ViewModels/MainWindow/SpineObjectListViewModel.cs index eafdbe9..b17bcda 100644 --- a/SpineViewer/ViewModels/MainWindow/SpineObjectListViewModel.cs +++ b/SpineViewer/ViewModels/MainWindow/SpineObjectListViewModel.cs @@ -11,6 +11,7 @@ using SpineViewer.ViewModels.Exporters; using System; using System.Collections; using System.Collections.Generic; +using System.Collections.Specialized; using System.IO; using System.Linq; using System.Text; @@ -45,6 +46,11 @@ namespace SpineViewer.ViewModels.MainWindow _customFFmpegExporterViewModel = new(_vmMain); } + /// + /// 请求选中项发生变化 + /// + public event NotifyCollectionChangedEventHandler? RequestSelectionChanging; + /// /// 单帧导出 ViewModel /// @@ -489,6 +495,19 @@ namespace SpineViewer.ViewModels.MainWindow { var sp = new SpineObjectModel(skelPath, atlasPath); lock (_spineObjectModels.Lock) _spineObjectModels.Add(sp); + if (Application.Current.Dispatcher.CheckAccess()) + { + RequestSelectionChanging?.Invoke(this, new(NotifyCollectionChangedAction.Reset)); + RequestSelectionChanging?.Invoke(this, new(NotifyCollectionChangedAction.Add, sp)); + } + else + { + Application.Current.Dispatcher.Invoke(() => + { + RequestSelectionChanging?.Invoke(this, new(NotifyCollectionChangedAction.Reset)); + RequestSelectionChanging?.Invoke(this, new(NotifyCollectionChangedAction.Add, sp)); + }); + } return true; } catch (Exception ex) @@ -505,6 +524,19 @@ namespace SpineViewer.ViewModels.MainWindow { var sp = new SpineObjectModel(cfg); lock (_spineObjectModels.Lock) _spineObjectModels.Add(sp); + if (Application.Current.Dispatcher.CheckAccess()) + { + RequestSelectionChanging?.Invoke(this, new(NotifyCollectionChangedAction.Reset)); + RequestSelectionChanging?.Invoke(this, new(NotifyCollectionChangedAction.Add, sp)); + } + else + { + Application.Current.Dispatcher.Invoke(() => + { + RequestSelectionChanging?.Invoke(this, new(NotifyCollectionChangedAction.Reset)); + RequestSelectionChanging?.Invoke(this, new(NotifyCollectionChangedAction.Add, sp)); + }); + } return true; } catch (Exception ex) diff --git a/SpineViewer/Views/MainWindow.xaml.cs b/SpineViewer/Views/MainWindow.xaml.cs index 85bfa9c..f775e7b 100644 --- a/SpineViewer/Views/MainWindow.xaml.cs +++ b/SpineViewer/Views/MainWindow.xaml.cs @@ -30,7 +30,7 @@ namespace SpineViewer.Views; public partial class MainWindow : Window { /// - /// 布局文件保存路径 + /// 上一次状态文件保存路径 /// public static readonly string LastStateFilePath = Path.Combine(Path.GetDirectoryName(Environment.ProcessPath), "laststate.json"); @@ -46,8 +46,8 @@ public partial class MainWindow : Window InitializeLogConfiguration(); _vm = new (_renderPanel); DataContext = _vm; + _vm.SpineObjectListViewModel.RequestSelectionChanging += SpinesListView_RequestSelectionChanging; _vm.SFMLRendererViewModel.RequestSelectionChanging += SpinesListView_RequestSelectionChanging; - Loaded += MainWindow_Loaded; Closed += MainWindow_Closed; }