Bläddra i källkod

Use PlatformColorValues in the control catalog

Max Katz 2 år sedan
förälder
incheckning
ad4005ef05
1 ändrade filer med 72 tillägg och 1 borttagningar
  1. 72 1
      samples/ControlCatalog/MainView.xaml.cs

+ 72 - 1
samples/ControlCatalog/MainView.xaml.cs

@@ -3,9 +3,12 @@ using System.Collections;
 using Avalonia;
 using Avalonia.Controls;
 using Avalonia.Controls.ApplicationLifetimes;
+using Avalonia.LogicalTree;
 using Avalonia.Markup.Xaml;
 using Avalonia.Media;
 using Avalonia.Media.Immutable;
+using Avalonia.Platform;
+using Avalonia.Styling;
 using Avalonia.VisualTree;
 using ControlCatalog.Models;
 using ControlCatalog.Pages;
@@ -14,10 +17,14 @@ namespace ControlCatalog
 {
     public class MainView : UserControl
     {
+        private readonly IPlatformSettings _platformSettings;
+
         public MainView()
         {
             AvaloniaXamlLoader.Load(this);
-
+            _platformSettings = AvaloniaLocator.Current.GetRequiredService<IPlatformSettings>();
+            PlatformSettingsOnColorValuesChanged(_platformSettings, _platformSettings.GetColorValues());
+            
             var sideBar = this.Get<TabControl>("Sidebar");
 
             if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime)
@@ -37,6 +44,15 @@ namespace ControlCatalog
                 if (themes.SelectedItem is CatalogTheme theme)
                 {
                     App.SetThemeVariant(theme);
+                    
+                    ((TopLevel?)this.GetVisualRoot())?.PlatformImpl?.SetFrameThemeVariant(theme switch
+                    {
+                        CatalogTheme.FluentLight => PlatformThemeVariant.Light,
+                        CatalogTheme.FluentDark => PlatformThemeVariant.Dark,
+                        CatalogTheme.SimpleLight => PlatformThemeVariant.Light,
+                        CatalogTheme.SimpleDark => PlatformThemeVariant.Dark,
+                        _ => throw new ArgumentOutOfRangeException()
+                    });
                 }
             };
 
@@ -89,6 +105,61 @@ namespace ControlCatalog
             var decorations = this.Get<ComboBox>("Decorations");
             if (VisualRoot is Window window)
                 decorations.SelectedIndex = (int)window.SystemDecorations;
+            
+            _platformSettings.ColorValuesChanged += PlatformSettingsOnColorValuesChanged;
+        }
+
+        protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e)
+        {
+            base.OnDetachedFromLogicalTree(e);
+            
+            _platformSettings.ColorValuesChanged -= PlatformSettingsOnColorValuesChanged;
+        }
+
+        private void PlatformSettingsOnColorValuesChanged(object? sender, PlatformColorValues e)
+        {
+            var themes = this.Get<ComboBox>("Themes");
+            var currentTheme = (CatalogTheme?)themes.SelectedItem ?? CatalogTheme.FluentLight;
+            var newTheme = (currentTheme, e.ThemeVariant) switch
+            {
+                (CatalogTheme.FluentDark, PlatformThemeVariant.Light) => CatalogTheme.FluentLight,
+                (CatalogTheme.FluentLight, PlatformThemeVariant.Dark) => CatalogTheme.FluentDark,
+                (CatalogTheme.SimpleDark, PlatformThemeVariant.Light) => CatalogTheme.SimpleLight,
+                (CatalogTheme.SimpleLight, PlatformThemeVariant.Dark) => CatalogTheme.SimpleDark,
+                _ => currentTheme
+            };
+            themes.SelectedItem = newTheme;
+
+            Application.Current!.Resources["SystemAccentColor"] = e.AccentColor1;
+            Application.Current.Resources["SystemAccentColorDark1"] = ChangeColorLuminosity(e.AccentColor1, -0.3);
+            Application.Current.Resources["SystemAccentColorDark2"] = ChangeColorLuminosity(e.AccentColor1, -0.5);
+            Application.Current.Resources["SystemAccentColorDark3"] = ChangeColorLuminosity(e.AccentColor1, -0.7);
+            Application.Current.Resources["SystemAccentColorLight1"] = ChangeColorLuminosity(e.AccentColor1, -0.3);
+            Application.Current.Resources["SystemAccentColorLight2"] = ChangeColorLuminosity(e.AccentColor1, -0.5);
+            Application.Current.Resources["SystemAccentColorLight3"] = ChangeColorLuminosity(e.AccentColor1, -0.7);
+
+            static Color ChangeColorLuminosity(Color color, double luminosityFactor)
+            {
+                var red = (double)color.R;
+                var green = (double)color.G;
+                var blue = (double)color.B;
+
+                if (luminosityFactor < 0)
+                {
+                    luminosityFactor = 1 + luminosityFactor;
+                    red *= luminosityFactor;
+                    green *= luminosityFactor;
+                    blue *= luminosityFactor;
+                }
+                else if (luminosityFactor >= 0)
+                {
+                    red = (255 - red) * luminosityFactor + red;
+                    green = (255 - green) * luminosityFactor + green;
+                    blue = (255 - blue) * luminosityFactor + blue;
+                }
+
+                return new Color(color.A, (byte)red, (byte)green, (byte)blue);
+            }
         }
     }
 }