support for AccentColor
This commit is contained in:
1 parent
3da5662a90
commit
95694e7e27
1 file changed
+96
-15
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
|
using System.Windows.Media;
|
||||||
using HandyControl.Data;
|
using HandyControl.Data;
|
||||||
using HandyControl.Tools;
|
using HandyControl.Tools;
|
||||||
using HandyControl.Tools.Helper;
|
using HandyControl.Tools.Helper;
|
||||||
@@ -19,17 +20,11 @@ namespace HandyControl.Themes
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UpdateResource();
|
InitResource();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Uri _source;
|
#region Skin
|
||||||
|
|
||||||
public new Uri Source
|
|
||||||
{
|
|
||||||
get => DesignerHelper.IsInDesignMode ? null : _source;
|
|
||||||
set => _source = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private SkinType _manualSkinType;
|
private SkinType _manualSkinType;
|
||||||
|
|
||||||
@@ -43,7 +38,7 @@ namespace HandyControl.Themes
|
|||||||
if (_skin == value) return;
|
if (_skin == value) return;
|
||||||
_skin = value;
|
_skin = value;
|
||||||
|
|
||||||
UpdateResource();
|
UpdateSkin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,6 +93,10 @@ namespace HandyControl.Themes
|
|||||||
public static SkinType GetSkin(DependencyObject element)
|
public static SkinType GetSkin(DependencyObject element)
|
||||||
=> (SkinType) element.GetValue(SkinProperty);
|
=> (SkinType) element.GetValue(SkinProperty);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region SyncWithSystem
|
||||||
|
|
||||||
private bool _syncWithSystem;
|
private bool _syncWithSystem;
|
||||||
|
|
||||||
public bool SyncWithSystem
|
public bool SyncWithSystem
|
||||||
@@ -109,14 +108,17 @@ namespace HandyControl.Themes
|
|||||||
|
|
||||||
if (value)
|
if (value)
|
||||||
{
|
{
|
||||||
_manualSkinType = Skin;
|
_manualSkinType = _skin;
|
||||||
SyncWithSystemTheme();
|
SyncWithSystemTheme();
|
||||||
|
|
||||||
SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;
|
SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SystemEvents.UserPreferenceChanged -= SystemEvents_UserPreferenceChanged;
|
SystemEvents.UserPreferenceChanged -= SystemEvents_UserPreferenceChanged;
|
||||||
Skin = _manualSkinType;
|
|
||||||
|
_skin = _manualSkinType;
|
||||||
|
UpdateSkin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -129,17 +131,96 @@ namespace HandyControl.Themes
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SyncWithSystemTheme() => Skin = SystemHelper.DetermineIfInLightThemeMode() ? SkinType.Default : SkinType.Dark;
|
private void SyncWithSystemTheme()
|
||||||
|
{
|
||||||
|
_skin = SystemHelper.DetermineIfInLightThemeMode() ? SkinType.Default : SkinType.Dark;
|
||||||
|
UpdateSkin();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region AccentColor
|
||||||
|
|
||||||
|
private Color? _accentColor;
|
||||||
|
|
||||||
|
public Color? AccentColor
|
||||||
|
{
|
||||||
|
get => _accentColor;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_accentColor = value;
|
||||||
|
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
_precSkin = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateSkin();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Source
|
||||||
|
|
||||||
|
private Uri _source;
|
||||||
|
|
||||||
|
public new Uri Source
|
||||||
|
{
|
||||||
|
get => DesignerHelper.IsInDesignMode ? null : _source;
|
||||||
|
set => _source = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|
||||||
public virtual ResourceDictionary GetSkin(SkinType skinType) => ResourceHelper.GetSkin(skinType);
|
private SkinType _prevSkinType;
|
||||||
|
|
||||||
|
private ResourceDictionary _precSkin;
|
||||||
|
|
||||||
|
public virtual ResourceDictionary GetSkin(SkinType skinType)
|
||||||
|
{
|
||||||
|
if (_precSkin == null || _prevSkinType != skinType)
|
||||||
|
{
|
||||||
|
_precSkin = ResourceHelper.GetSkin(skinType);
|
||||||
|
_prevSkinType = skinType;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!SyncWithSystem)
|
||||||
|
{
|
||||||
|
if (AccentColor != null)
|
||||||
|
{
|
||||||
|
_precSkin[ResourceToken.PrimaryColor] = AccentColor;
|
||||||
|
_precSkin[ResourceToken.DarkPrimaryColor] = AccentColor;
|
||||||
|
_precSkin[ResourceToken.TitleColor] = AccentColor;
|
||||||
|
_precSkin[ResourceToken.SecondaryTitleColor] = AccentColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var windowGlassColor = ((SolidColorBrush) SystemParameters.WindowGlassBrush).Color;
|
||||||
|
|
||||||
|
_precSkin[ResourceToken.PrimaryColor] = windowGlassColor;
|
||||||
|
_precSkin[ResourceToken.DarkPrimaryColor] = windowGlassColor;
|
||||||
|
_precSkin[ResourceToken.TitleColor] = windowGlassColor;
|
||||||
|
_precSkin[ResourceToken.SecondaryTitleColor] = windowGlassColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _precSkin;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateSkin() => MergedDictionaries[0] = GetSkin(Skin);
|
||||||
|
|
||||||
public virtual ResourceDictionary GetTheme() => ResourceHelper.GetTheme();
|
public virtual ResourceDictionary GetTheme() => ResourceHelper.GetTheme();
|
||||||
|
|
||||||
private void UpdateResource()
|
private void InitResource()
|
||||||
{
|
{
|
||||||
if (DesignerHelper.IsInDesignMode) return;
|
if (DesignerHelper.IsInDesignMode)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
MergedDictionaries.Clear();
|
MergedDictionaries.Clear();
|
||||||
MergedDictionaries.Add(GetSkin(Skin));
|
MergedDictionaries.Add(GetSkin(Skin));
|
||||||
MergedDictionaries.Add(GetTheme());
|
MergedDictionaries.Add(GetTheme());
|
||||||
|
|||||||
Reference in new issue
Block a user