using Microsoft.Win32; using WPFluent.Interop; namespace WPFluent.Appearance; public static class SystemMenuThemeManager { public static void Apply(SystemMenuTheme theme = SystemMenuTheme.Auto) { // Enable dark mode for context menus if using dark theme if (Environment.OSVersion.Version.Build >= 18362) // Windows 10 1903 { if (theme == SystemMenuTheme.Auto) { // UxTheme methods will apply all of menus. // However, the Windows style system prefers that // Windows System Menu is based on `Apps Theme`, // and Tray Context Menu is based on `System Theme` when using a custom theme. // But actually we can't have our cake and eat it too. // Finally, we synchronize the theme styles of tray with higher usage rates. if (ApplicationThemeManager.GetSystemTheme() == SystemTheme.Dark) { _ = UxTheme.SetPreferredAppMode(UxTheme.PreferredAppMode.ForceDark); UxTheme.FlushMenuThemes(); } // Synchronize the theme with system settings SystemEvents.UserPreferenceChanged -= OnUserPreferenceChangedEventHandler; SystemEvents.UserPreferenceChanged += OnUserPreferenceChangedEventHandler; } else if (theme == SystemMenuTheme.Dark) { SystemEvents.UserPreferenceChanged -= OnUserPreferenceChangedEventHandler; _ = UxTheme.SetPreferredAppMode(UxTheme.PreferredAppMode.ForceDark); UxTheme.FlushMenuThemes(); } else if (theme == SystemMenuTheme.Light) { SystemEvents.UserPreferenceChanged -= OnUserPreferenceChangedEventHandler; _ = UxTheme.SetPreferredAppMode(UxTheme.PreferredAppMode.ForceLight); UxTheme.FlushMenuThemes(); } } } private static void OnUserPreferenceChangedEventHandler(object sender, UserPreferenceChangedEventArgs e) { if (ApplicationThemeManager.GetSystemTheme() == SystemTheme.Dark) { _ = UxTheme.SetPreferredAppMode(UxTheme.PreferredAppMode.ForceDark); UxTheme.FlushMenuThemes(); } else { _ = UxTheme.SetPreferredAppMode(UxTheme.PreferredAppMode.ForceLight); UxTheme.FlushMenuThemes(); } } } /// /// Theme in which an system menu is displayed. /// public enum SystemMenuTheme { /// /// Auto system theme. /// Auto = ApplicationTheme.Unknown, /// /// Dark system theme. /// Dark = ApplicationTheme.Dark, /// /// Light system theme. /// Light = ApplicationTheme.Light, }