گوش دادن به تغییرات تم ویندوز 10 بدون نیاز به WinRT در سی شارپ
نویسنده: مهدی حسینی
تاریخ: ۱۳۹۹/۱۰/۱۱ ۱۹:۳۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
pubic class ThemeHelper
{
public ThemeHelper()
{
SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;
}
private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
{
switch (e.Category)
{
case UserPreferenceCategory.Accessibility:
break;
case UserPreferenceCategory.Color:
break;
case UserPreferenceCategory.Desktop:
break;
case UserPreferenceCategory.General:
break;
case UserPreferenceCategory.Icon:
break;
case UserPreferenceCategory.Keyboard:
break;
case UserPreferenceCategory.Menu:
break;
case UserPreferenceCategory.Mouse:
break;
case UserPreferenceCategory.Policy:
break;
case UserPreferenceCategory.Power:
break;
case UserPreferenceCategory.Screensaver:
break;
case UserPreferenceCategory.Window:
break;
case UserPreferenceCategory.Locale:
break;
case UserPreferenceCategory.VisualStyle:
break;
}
}
} private const string RegistryKeyPathTheme = @"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize";
private const string RegSysMode = "SystemUsesLightTheme";
public static UITheme GetWindowsTheme()
{
return GetThemeFromRegistry(RegSysMode);
}
private static UITheme GetThemeFromRegistry(string registryKey)
{
using var key = Registry.CurrentUser.OpenSubKey(RegistryKeyPathTheme);
var themeValue = key?.GetValue(registryKey) as int?;
return themeValue != 0 ? UITheme.Light : UITheme.Dark;
}
public enum UITheme
{
Light,
Dark
} public event EventHandler<FunctionEventArgs<UIWindowTheme>> WindowsThemeChanged;
protected virtual void OnWindowsThemeChanged(UIWindowTheme theme)
{
EventHandler<FunctionEventArgs<UIWindowTheme>> handler = WindowsThemeChanged;
handler?.Invoke(this, new FunctionEventArgs<UIWindowTheme>(theme));
} public class FunctionEventArgs<T> : RoutedEventArgs
{
public FunctionEventArgs(T theme)
{
Theme = theme;
}
public FunctionEventArgs(RoutedEvent routedEvent, object source) : base(routedEvent, source) { }
public T Theme { get; set; }
} FunctionEventArgs<UIWindowTheme>
public class UIWindowTheme
{
public Brush AccentBrush { get; set; }
public UITheme CurrentTheme { get; set; }
} case UserPreferenceCategory.General:
var changedTheme = new UIWindowTheme()
{
AccentBrush = SystemParameters.WindowGlassBrush,
CurrentTheme = GetWindowsTheme()
};
OnWindowsThemeChanged(changedTheme);
break; ThemeHelper tm = new ThemeHelper();
tm.WindowsThemeChanged +=OnWindowsThemeChanged;
private void OnWindowsThemeChanged(object? sender, FunctionEventArgs<RegistryThemeHelper.UIWindowTheme> e)
{
rec.Fill = e.Theme.AccentBrush;
if (e.Theme.CurrentTheme == ThemeHelper.UITheme.Light)
{
Background = Brushes.White;
}
else
{
Background = Brushes.Black;
}
}