using WPFluent.Extensions; using WPFluent.Interop; namespace WPFluent.Appearance; /// /// Allows updating the accents used by controls in the application by swapping dynamic resources. /// /// /// /// ApplicationAccentColorManager.Apply( /// Color.FromArgb(0xFF, 0xEE, 0x00, 0xBB), /// /// ApplicationTheme.Dark, /// false /// ); /// /// /// ApplicationAccentColorManager.Apply( /// ApplicationAccentColorManager.GetColorizationColor(), /// /// ApplicationTheme.Dark, /// false /// ); /// /// public static class ApplicationAccentColorManager { /// /// The maximum value of the background HSV brightness after which the text on the accent will be turned dark. /// private const double BackgroundBrightnessThresholdValue = 80d; /// /// Updates application resources. /// private static void UpdateColorResources( Color systemAccent, Color primaryAccent, Color secondaryAccent, Color tertiaryAccent) { System.Diagnostics.Debug.WriteLine($"INFO | SystemAccentColor: {systemAccent}", "WPFluent.Accent"); System.Diagnostics.Debug .WriteLine($"INFO | SystemAccentColorPrimary: {primaryAccent}", "WPFluent.Accent"); System.Diagnostics.Debug .WriteLine($"INFO | SystemAccentColorSecondary: {secondaryAccent}", "WPFluent.Accent"); System.Diagnostics.Debug .WriteLine($"INFO | SystemAccentColorTertiary: {tertiaryAccent}", "WPFluent.Accent"); if(secondaryAccent.GetBrightness() > BackgroundBrightnessThresholdValue) { System.Diagnostics.Debug.WriteLine("INFO | Text on accent is DARK", "WPFluent.Accent"); UiApplication.Current.Resources["TextOnAccentFillColorPrimary"] = Color.FromArgb(0xFF, 0x00, 0x00, 0x00); UiApplication.Current.Resources["TextOnAccentFillColorSecondary"] = Color.FromArgb(0x80, 0x00, 0x00, 0x00); UiApplication.Current.Resources["TextOnAccentFillColorDisabled"] = Color.FromArgb(0x77, 0x00, 0x00, 0x00); UiApplication.Current.Resources["TextOnAccentFillColorSelectedText"] = Color.FromArgb( 0x00, 0x00, 0x00, 0x00); UiApplication.Current.Resources["AccentTextFillColorDisabled"] = Color.FromArgb(0x5D, 0x00, 0x00, 0x00); } else { System.Diagnostics.Debug.WriteLine("INFO | Text on accent is LIGHT", "WPFluent.Accent"); UiApplication.Current.Resources["TextOnAccentFillColorPrimary"] = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF); UiApplication.Current.Resources["TextOnAccentFillColorSecondary"] = Color.FromArgb(0x80, 0xFF, 0xFF, 0xFF); UiApplication.Current.Resources["TextOnAccentFillColorDisabled"] = Color.FromArgb(0x87, 0xFF, 0xFF, 0xFF); UiApplication.Current.Resources["TextOnAccentFillColorSelectedText"] = Color.FromArgb( 0xFF, 0xFF, 0xFF, 0xFF); UiApplication.Current.Resources["AccentTextFillColorDisabled"] = Color.FromArgb(0x5D, 0xFF, 0xFF, 0xFF); } UiApplication.Current.Resources["SystemAccentColor"] = systemAccent; UiApplication.Current.Resources["SystemAccentColorPrimary"] = primaryAccent; UiApplication.Current.Resources["SystemAccentColorSecondary"] = secondaryAccent; UiApplication.Current.Resources["SystemAccentColorTertiary"] = tertiaryAccent; UiApplication.Current.Resources["SystemAccentBrush"] = secondaryAccent.ToBrush(); UiApplication.Current.Resources["SystemFillColorAttentionBrush"] = secondaryAccent.ToBrush(); UiApplication.Current.Resources["AccentTextFillColorPrimaryBrush"] = tertiaryAccent.ToBrush(); UiApplication.Current.Resources["AccentTextFillColorSecondaryBrush"] = tertiaryAccent.ToBrush(); UiApplication.Current.Resources["AccentTextFillColorTertiaryBrush"] = secondaryAccent.ToBrush(); UiApplication.Current.Resources["AccentFillColorSelectedTextBackgroundBrush"] = systemAccent.ToBrush(); UiApplication.Current.Resources["AccentFillColorDefaultBrush"] = secondaryAccent.ToBrush(); UiApplication.Current.Resources["AccentFillColorSecondaryBrush"] = secondaryAccent.ToBrush(0.9); UiApplication.Current.Resources["AccentFillColorTertiaryBrush"] = secondaryAccent.ToBrush(0.8); } /// /// Changes the color accents of the application based on the color entered. /// /// Primary accent color. /// If , the colors will be different. /// /// If the color is taken from the Glass Color System, its brightness will be increased with the help of the /// operations on HSV space. /// public static void Apply( Color systemAccent, ApplicationTheme applicationTheme = ApplicationTheme.Light, bool systemGlassColor = false) { if(systemGlassColor) { // WindowGlassColor is little darker than accent color systemAccent = systemAccent.UpdateBrightness(6f); } Color primaryAccent; Color secondaryAccent; Color tertiaryAccent; if(applicationTheme == ApplicationTheme.Dark) { primaryAccent = systemAccent.Update(15f, -12f); secondaryAccent = systemAccent.Update(30f, -24f); tertiaryAccent = systemAccent.Update(45f, -36f); } else { primaryAccent = systemAccent.UpdateBrightness(-5f); secondaryAccent = systemAccent.UpdateBrightness(-10f); tertiaryAccent = systemAccent.UpdateBrightness(-15f); } UpdateColorResources(systemAccent, primaryAccent, secondaryAccent, tertiaryAccent); } /// /// Changes the color accents of the application based on the entered colors. /// /// Primary color. /// Alternative light or dark color. /// Second alternative light or dark color (most used). /// Third alternative light or dark color. public static void Apply(Color systemAccent, Color primaryAccent, Color secondaryAccent, Color tertiaryAccent) { UpdateColorResources(systemAccent, primaryAccent, secondaryAccent, tertiaryAccent); } /// /// Applies system accent color to the application. /// public static void ApplySystemAccent() { Apply(GetColorizationColor(), ApplicationThemeManager.GetAppTheme()); } /// /// Gets current Desktop Window Manager colorization color. It should be the color defined in the system /// Personalization. /// public static Color GetColorizationColor() { return UnsafeNativeMethods.GetDwmColor(); } /// /// Gets the SystemAccentColorPrimary. /// public static Color PrimaryAccent { get { object? resource = UiApplication.Current.Resources["SystemAccentColorPrimary"]; if(resource is Color color) { return color; } return Colors.Transparent; } } /// /// Gets the of the SystemAccentColorPrimary. /// public static Brush PrimaryAccentBrush => new SolidColorBrush(PrimaryAccent); /// /// Gets the SystemAccentColorSecondary. /// public static Color SecondaryAccent { get { object? resource = UiApplication.Current.Resources["SystemAccentColorSecondary"]; if(resource is Color color) { return color; } return Colors.Transparent; } } /// /// Gets the of the SystemAccentColorSecondary. /// public static Brush SecondaryAccentBrush => new SolidColorBrush(SecondaryAccent); /// /// Gets the SystemAccentColor. /// public static Color SystemAccent { get { object? resource = UiApplication.Current.Resources["SystemAccentColor"]; if(resource is Color color) { return color; } return Colors.Transparent; } } /// /// Gets the of the SystemAccentColor. /// public static Brush SystemAccentBrush => new SolidColorBrush(SystemAccent); /// /// Gets the SystemAccentColorTertiary. /// public static Color TertiaryAccent { get { object? resource = UiApplication.Current.Resources["SystemAccentColorTertiary"]; if(resource is Color color) { return color; } return Colors.Transparent; } } /// /// Gets the of the SystemAccentColorTertiary. /// public static Brush TertiaryAccentBrush => new SolidColorBrush(TertiaryAccent); }