整理控件库
This commit is contained in:
219
WPFluent/Appearance/AccentColorManager.cs
Normal file
219
WPFluent/Appearance/AccentColorManager.cs
Normal file
@@ -0,0 +1,219 @@
|
||||
using WPFluent.Extensions;
|
||||
using WPFluent.Interop;
|
||||
|
||||
namespace WPFluent.Appearance;
|
||||
|
||||
/// <summary>
|
||||
/// 允许通过交换动态资源来更新应用程序中控件使用的Accent。
|
||||
/// </summary>
|
||||
/// <example>
|
||||
/// <code lang="csharp">
|
||||
/// AccentColorManager.ChangeAppTheme(Color.FromArgb(0xFF, 0xEE, 0x00, 0xBB),ThemeType.Dark,false);
|
||||
/// </code>
|
||||
/// <code lang="csharp">
|
||||
/// AccentColorManager.ChangeAppTheme(AccentColorManager.GetColorizationColor(),ThemeType.Dark,false);
|
||||
///</code>
|
||||
/// </example>
|
||||
public static class AccentColorManager
|
||||
{
|
||||
/// <summary>
|
||||
/// 背景 HSV 亮度的最大值,超过该值后,重音上的文字将变暗。
|
||||
/// </summary>
|
||||
private const double BackgroundBrightnessThresholdValue = 80d;
|
||||
|
||||
/// <summary>
|
||||
/// Updates application resources.
|
||||
/// </summary>
|
||||
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");
|
||||
ThemeManager.Current.Resources["TextOnAccentFillColorPrimary"] = Color.FromArgb(0xFF, 0x00, 0x00, 0x00);
|
||||
ThemeManager.Current.Resources["TextOnAccentFillColorSecondary"] = Color.FromArgb(0x80, 0x00, 0x00, 0x00);
|
||||
ThemeManager.Current.Resources["TextOnAccentFillColorDisabled"] = Color.FromArgb(0x77, 0x00, 0x00, 0x00);
|
||||
ThemeManager.Current.Resources["TextOnAccentFillColorSelectedText"] = Color.FromArgb(
|
||||
0x00,
|
||||
0x00,
|
||||
0x00,
|
||||
0x00);
|
||||
ThemeManager.Current.Resources["AccentTextFillColorDisabled"] = Color.FromArgb(0x5D, 0x00, 0x00, 0x00);
|
||||
}
|
||||
else
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine("INFO | Text on accent is LIGHT", "WPFluent.Accent");
|
||||
ThemeManager.Current.Resources["TextOnAccentFillColorPrimary"] = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
|
||||
ThemeManager.Current.Resources["TextOnAccentFillColorSecondary"] = Color.FromArgb(0x80, 0xFF, 0xFF, 0xFF);
|
||||
ThemeManager.Current.Resources["TextOnAccentFillColorDisabled"] = Color.FromArgb(0x87, 0xFF, 0xFF, 0xFF);
|
||||
ThemeManager.Current.Resources["TextOnAccentFillColorSelectedText"] = Color.FromArgb(
|
||||
0xFF,
|
||||
0xFF,
|
||||
0xFF,
|
||||
0xFF);
|
||||
ThemeManager.Current.Resources["AccentTextFillColorDisabled"] = Color.FromArgb(0x5D, 0xFF, 0xFF, 0xFF);
|
||||
}
|
||||
|
||||
ThemeManager.Current.Resources["SystemAccentColor"] = systemAccent;
|
||||
ThemeManager.Current.Resources["SystemAccentColorPrimary"] = primaryAccent;
|
||||
ThemeManager.Current.Resources["SystemAccentColorSecondary"] = secondaryAccent;
|
||||
ThemeManager.Current.Resources["SystemAccentColorTertiary"] = tertiaryAccent;
|
||||
|
||||
ThemeManager.Current.Resources["SystemAccentBrush"] = secondaryAccent.ToBrush();
|
||||
ThemeManager.Current.Resources["SystemFillColorAttentionBrush"] = secondaryAccent.ToBrush();
|
||||
ThemeManager.Current.Resources["AccentTextFillColorPrimaryBrush"] = tertiaryAccent.ToBrush();
|
||||
ThemeManager.Current.Resources["AccentTextFillColorSecondaryBrush"] = tertiaryAccent.ToBrush();
|
||||
ThemeManager.Current.Resources["AccentTextFillColorTertiaryBrush"] = secondaryAccent.ToBrush();
|
||||
ThemeManager.Current.Resources["AccentFillColorSelectedTextBackgroundBrush"] =
|
||||
systemAccent.ToBrush();
|
||||
ThemeManager.Current.Resources["AccentFillColorDefaultBrush"] = secondaryAccent.ToBrush();
|
||||
|
||||
ThemeManager.Current.Resources["AccentFillColorSecondaryBrush"] = secondaryAccent.ToBrush(0.9);
|
||||
ThemeManager.Current.Resources["AccentFillColorTertiaryBrush"] = secondaryAccent.ToBrush(0.8);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据输入的颜色更改应用程序的色彩基调。
|
||||
/// </summary>
|
||||
/// <param name="systemAccent">原色强调色。</param>
|
||||
/// <param name="applicationTheme">如果是<see cref="ThemeType.Dark"/>,颜色将有所不同。</param>
|
||||
/// <param name="systemGlassColor">
|
||||
/// 如果颜色取自玻璃色彩系统,则其亮度将借助 HSV 空间的操作而提高。
|
||||
/// </param>
|
||||
public static void Apply(
|
||||
Color systemAccent,
|
||||
ThemeType applicationTheme = ThemeType.Light,
|
||||
bool systemGlassColor = false)
|
||||
{
|
||||
if (systemGlassColor)
|
||||
{
|
||||
// WindowGlassColor 比强调色深一点
|
||||
systemAccent = systemAccent.UpdateBrightness(6f);
|
||||
}
|
||||
|
||||
Color primaryAccent;
|
||||
Color secondaryAccent;
|
||||
Color tertiaryAccent;
|
||||
|
||||
if (applicationTheme == ThemeType.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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据输入的颜色更改应用程序的强调色。
|
||||
/// </summary>
|
||||
/// <param name="systemAccent">主色调</param>
|
||||
/// <param name="primaryAccent">浅色或深色可供选择。</param>
|
||||
/// <param name="secondaryAccent">第二种备选的浅色或深色(最常用)。</param>
|
||||
/// <param name="tertiaryAccent">第三种备选的浅色或深色。</param>
|
||||
public static void Apply(Color systemAccent, Color primaryAccent, Color secondaryAccent, Color tertiaryAccent)
|
||||
{ UpdateColorResources(systemAccent, primaryAccent, secondaryAccent, tertiaryAccent); }
|
||||
|
||||
/// <summary>
|
||||
/// 获取SystemAccentColorPrimary.
|
||||
/// </summary>
|
||||
public static Color PrimaryAccent
|
||||
{
|
||||
get
|
||||
{
|
||||
object? resource = ThemeManager.Current.Resources["SystemAccentColorPrimary"];
|
||||
|
||||
if (resource is Color color)
|
||||
{
|
||||
return color;
|
||||
}
|
||||
|
||||
return Colors.Transparent;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the <see cref="Brush"/> of the SystemAccentColorPrimary.
|
||||
/// </summary>
|
||||
public static Brush PrimaryAccentBrush => new SolidColorBrush(PrimaryAccent);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the SystemAccentColorSecondary.
|
||||
/// </summary>
|
||||
public static Color SecondaryAccent
|
||||
{
|
||||
get
|
||||
{
|
||||
object? resource = ThemeManager.Current.Resources["SystemAccentColorSecondary"];
|
||||
|
||||
if (resource is Color color)
|
||||
{
|
||||
return color;
|
||||
}
|
||||
|
||||
return Colors.Transparent;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the <see cref="Brush"/> of the SystemAccentColorSecondary.
|
||||
/// </summary>
|
||||
public static Brush SecondaryAccentBrush => new SolidColorBrush(SecondaryAccent);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the SystemAccentColor.
|
||||
/// </summary>
|
||||
public static Color SystemAccent
|
||||
{
|
||||
get
|
||||
{
|
||||
object? resource = ThemeManager.Current.Resources["SystemAccentColor"];
|
||||
|
||||
if (resource is Color color)
|
||||
{
|
||||
return color;
|
||||
}
|
||||
|
||||
return Colors.Transparent;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the <see cref="Brush"/> of the SystemAccentColor.
|
||||
/// </summary>
|
||||
public static Brush SystemAccentBrush => new SolidColorBrush(SystemAccent);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the SystemAccentColorTertiary.
|
||||
/// </summary>
|
||||
public static Color TertiaryAccent
|
||||
{
|
||||
get
|
||||
{
|
||||
object? resource = ThemeManager.Current.Resources["SystemAccentColorTertiary"];
|
||||
|
||||
if (resource is Color color)
|
||||
{
|
||||
return color;
|
||||
}
|
||||
|
||||
return Colors.Transparent;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the <see cref="Brush"/> of the SystemAccentColorTertiary.
|
||||
/// </summary>
|
||||
public static Brush TertiaryAccentBrush => new SolidColorBrush(TertiaryAccent);
|
||||
}
|
||||
Reference in New Issue
Block a user