diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index d3a3e192..6a5ebc67 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -1441,7 +1441,7 @@ FontSize="14" Margin="0,0,0,6" /> diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index c441956c..6d40b4e6 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -1165,6 +1165,7 @@ namespace Ink_Canvas public static Settings Settings = new Settings(); public static string settingsFileName = Path.Combine("Configs", "Settings.json"); private bool isLoaded; + private bool _suppressChickenSoupSourceSelectionChanged; private bool forcePointEraser; /// diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs index b4617047..a3e2eead 100644 --- a/Ink Canvas/MainWindow_cs/MW_Settings.cs +++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs @@ -1261,8 +1261,11 @@ namespace Ink_Canvas /// private async void ComboBoxChickenSoupSource_SelectionChanged(object sender, RoutedEventArgs e) { + if (_suppressChickenSoupSourceSelectionChanged) return; if (!isLoaded) return; int idx = ComboBoxChickenSoupSource.SelectedIndex; + if (idx < 0) return; + if (Settings.Appearance.ChickenSoupSource == idx) return; Settings.Appearance.ChickenSoupSource = idx; diff --git a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs index c9616ec1..dafc9971 100644 --- a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs +++ b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs @@ -440,7 +440,17 @@ namespace Ink_Canvas // 设置主题下拉框 ComboBoxTheme.SelectedIndex = Settings.Appearance.Theme; - ComboBoxChickenSoupSource.SelectedIndex = Settings.Appearance.ChickenSoupSource; + _suppressChickenSoupSourceSelectionChanged = true; + try + { + ComboBoxChickenSoupSource.SelectedIndex = Settings.Appearance.ChickenSoupSource; + } + finally + { + Dispatcher.BeginInvoke( + (Action)(() => { _suppressChickenSoupSourceSelectionChanged = false; }), + DispatcherPriority.ContextIdle); + } // 初始化自定义按钮的可见性(仅在选择API时显示) if (BtnHitokotoCustomize != null) @@ -450,11 +460,6 @@ namespace Ink_Canvas : Visibility.Collapsed; } - // 初始化HitokotoCategories,如果为空则默认全选 - if (Settings.Appearance.HitokotoCategories == null || Settings.Appearance.HitokotoCategories.Count == 0) - { - Settings.Appearance.HitokotoCategories = new List { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l" }; - } ToggleSwitchEnableQuickPanel.IsOn = Settings.Appearance.IsShowQuickPanel; @@ -869,6 +874,8 @@ namespace Ink_Canvas ToggleSwitchClearCanvasAlsoClearImages.IsOn = Settings.Canvas.ClearCanvasAlsoClearImages; ToggleSwitchShowCircleCenter.IsOn = Settings.Canvas.ShowCircleCenter; + ApplyWhiteboardBoothToolbarFromSettings(); + switch (Settings.Canvas.EraserShapeType) { case 0: @@ -1494,7 +1501,7 @@ namespace Ink_Canvas Settings defaultSettings = new Settings(); // 将默认配置和用户配置都序列化为JObject - JObject defaultConfigObj = JObject.FromObject(defaultSettings); + JObject defaultConfigObj = JObject.FromObject(defaultSettings); EnsureDefaultConfigSchemaIncludesIgnoredNullKeys(defaultConfigObj); JObject userConfigObj = JObject.Parse(userConfigJson); // 记录是否有清理操作 @@ -1535,6 +1542,13 @@ namespace Ink_Canvas /// 7. 删除标记的键 /// 8. 设置变更标志 /// + private static void EnsureDefaultConfigSchemaIncludesIgnoredNullKeys(JObject defaultConfigObj) + { + if (defaultConfigObj == null) return; + if (defaultConfigObj["appearance"] is JObject appearance && !appearance.ContainsKey("hitokotoCategories")) + appearance["hitokotoCategories"] = JValue.CreateNull(); + } + private void RemoveObsoleteProperties(JObject userObj, JObject defaultObj, ref bool hasChanges) { if (userObj == null || defaultObj == null)