using WPFluent.Extensions; using WPFluent.Interop; namespace WPFluent.Appearance; /// /// 允许通过交换动态资源来更新应用程序中控件使用的Accent。 /// /// /// /// ApplicationAccentColorManager.Apply(Color.FromArgb(0xFF, 0xEE, 0x00, 0xBB),ApplicationTheme.Dark,false); /// /// /// ApplicationAccentColorManager.Apply(ApplicationAccentColorManager.GetColorizationColor(),ApplicationTheme.Dark,false); /// /// public static class ApplicationAccentColorManager { /// /// 背景 HSV 亮度的最大值,超过该值后,重音上的文字将变暗。 /// private const double BackgroundBrightnessThresholdValue = 80d; /// /// Updates application resources. /// private static void UpdateColorResources( Color systemAccent, Color primaryAccent, Color secondaryAccent, Color tertiaryAccent) { 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); } /// /// 根据输入的颜色更改应用程序的色彩基调。 /// /// 原色强调色。 /// 如果是,颜色将有所不同。 /// /// 如果颜色取自玻璃色彩系统,则其亮度将借助 HSV 空间的操作而提高。 /// public static void Apply( Color systemAccent, ApplicationTheme applicationTheme = ApplicationTheme.Light, bool systemGlassColor = false) { if (systemGlassColor) { // WindowGlassColor 比强调色深一点 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); } /// /// 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); }