Răsfoiți Sursa

添加主题管理器

Jiangsheng 1 lună în urmă
părinte
comite
0df13ded45
3 a modificat fișierele cu 81 adăugiri și 1 ștergeri
  1. 1 0
      SKMC.UI/SKMC.UI.csproj
  2. 1 1
      SKMC.UI/Styles/Button.xaml
  3. 79 0
      SKMC.UI/Themes/ThemeManager.cs

+ 1 - 0
SKMC.UI/SKMC.UI.csproj

@@ -71,6 +71,7 @@
       <DependentUpon>Settings.settings</DependentUpon>
       <DesignTimeSharedInput>True</DesignTimeSharedInput>
     </Compile>
+    <Compile Include="Themes\ThemeManager.cs" />
     <Compile Include="ValidationRules\DateTimeRule.cs" />
     <Compile Include="ValidationRules\RangeValidationRule.cs" />
     <EmbeddedResource Include="Properties\Resources.resx">

+ 1 - 1
SKMC.UI/Styles/Button.xaml

@@ -119,7 +119,7 @@
                                   Stretch="Uniform"
                                   HorizontalAlignment="Center"
                                   VerticalAlignment="Center"
-                                  Margin="5 0 0 0"/>
+                                  Margin="10 0 0 0"/>
                             <ContentPresenter Grid.Column="1"
                                               Content="{TemplateBinding Content}"
                                               HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"

+ 79 - 0
SKMC.UI/Themes/ThemeManager.cs

@@ -0,0 +1,79 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace SKMC.UI.Themes
+{
+    /// <summary>
+    /// 主题管理器
+    /// </summary>
+    public static class ThemeManager
+    {
+        private static readonly string ThemesPath = "pack://application:,,,/SKMC.UI;component/Themes/";
+        /// <summary>
+        /// 变更主题资源
+        /// </summary>
+        /// <param name="themeName"></param>
+        public static void ChangeTheme(string themeName)
+        {
+            // 获取应用程序资源
+            var appResources = Application.Current.Resources;
+            var mergedDictionaries = appResources.MergedDictionaries;
+
+            // 查找并移除旧的 Light/Dark 主题字典
+            var oldThemeDict = mergedDictionaries
+                .FirstOrDefault(d => d.Source != null &&
+                                    (d.Source.OriginalString.Contains("/Themes/Light.xaml") ||
+                                     d.Source.OriginalString.Contains("/Themes/Dark.xaml")));
+
+            if (oldThemeDict != null)
+            {
+                mergedDictionaries.Remove(oldThemeDict);
+            }
+
+            // 添加新的主题字典
+            var newThemeDict = new ResourceDictionary
+            {
+                Source = new Uri($"{ThemesPath}{themeName}.xaml", UriKind.Absolute)
+            };
+
+            // 插入到合适的位置(通常在 Colors.xaml 之前)
+            //var colorsDict = mergedDictionaries
+            //    .FirstOrDefault(d => d.Source != null &&
+            //                        d.Source.OriginalString.Contains("/Assets/Colors.xaml"));
+
+            //if (colorsDict != null)
+            //{
+            //    var index = mergedDictionaries.IndexOf(colorsDict);
+            //    mergedDictionaries.Insert(index, newThemeDict);
+            //}
+            //else
+            //{
+            //    mergedDictionaries.Add(newThemeDict);
+            //}
+            mergedDictionaries.Add(newThemeDict);
+            ForceRefreshResources();
+        }
+
+        private static void ForceRefreshResources()
+        {
+            // 刷新所有窗口的资源
+            foreach (Window window in Application.Current.Windows)
+            {
+                window.InvalidateVisual();
+                window.UpdateLayout();
+                // 强制重新评估资源
+                var resources = window.Resources;
+                var merged = resources.MergedDictionaries;
+
+                foreach (var dict in merged)
+                {
+                    dict.Source = dict.Source;
+                }
+            }
+        }
+    }
+}