添加新的强调色和画笔 (MahApps)
Adding new accent colors and brushes (MahApps)
我正在转换应用程序以使用 MahApps 颜色和画笔资源,以允许我们以编程方式更改应用程序 theme/accent。
我需要一种非常浅的强调背景颜色(将在许多地方使用,并由不同类型的控件使用),但最浅的 MahApps 颜色 ("AccentColor4") 不够浅。如果不修改 MahApps 库,是否有任何方法可以在我的应用程序中创建额外的 Color 和 Brush 资源,这些资源能够以某种方式根据当前的 MahApps 口音改变它们的颜色?
对于您的情况,我想我会根据 AccentColor4
值向我的 Accent
(也许 AccentColor5
?)添加一个新密钥。
Here you can find a ThemeManagerHelper
class made by punker76,这可能会帮助您从 AccentColor4
计算出 AccentColor5
(参见 CreateAppStyleBy
方法)。
我也做了这个,这应该会让你的生活更轻松:
private void AddKeyForCurrentAccent(object key, object value, bool changeAccentImmediately = false)
{
Tuple<MahApps.Metro.AppTheme, MahApps.Metro.Accent> currentAppStyle = MahApps.Metro.ThemeManager.DetectAppStyle(Application.Current);
if(currentAppStyle.Item2.Resources.Contains(key))
{
currentAppStyle.Item2.Resources.Remove(key);
}
currentAppStyle.Item2.Resources.Add(key, value);
if(changeAccentImmediately)
{
var accentName = string.Format("CustomTheme.xaml");
CreateAccentFrom(accentName, currentAppStyle.Item2.Resources);
MahApps.Metro.ThemeManager.ChangeAppStyle(Application.Current, MahApps.Metro.ThemeManager.GetAccent(accentName), currentAppStyle.Item1);
}
}
private void CreateAccentFrom(string accentName, ResourceDictionary resourceDictionary)
{
var fileName = System.IO.Path.Combine(System.IO.Path.GetTempPath(), accentName);
using (var writer = System.Xml.XmlWriter.Create(fileName, new System.Xml.XmlWriterSettings { Indent = true }))
{
System.Windows.Markup.XamlWriter.Save(resourceDictionary, writer);
writer.Close();
}
resourceDictionary = new ResourceDictionary() { Source = new Uri(fileName, UriKind.Absolute) };
var newAccent = new MahApps.Metro.Accent { Name = accentName, Resources = resourceDictionary };
MahApps.Metro.ThemeManager.AddAccent(accentName, newAccent.Resources.Source);
}
AddKeyForCurrentAccent
将在应用程序的当前 Accent
中添加(或替换 - 如果它已经存在)一个键。
如果 changeAccentImmediately
设置为 true,它将创建一个新文件并保存新的 Accent
(使用 inserted/replaced 键)并将其设置为 Accent
申请
提示:您可以add/replace所有您想要的键并仅在最后一个键上将changeAccentImmediately
设置为true(这应该会提高性能)。
这样使用:
AddKeyForCurrentAccent("AccentColor5", Brushes.Pink); // Does not replace the accent immediately (so changes are not visible) - works faster
// AND/OR
AddKeyForCurrentAccent("AccentColor5", Brushes.HotPink, true); // Will update the UI
重要提示:请注意,如果您使用自定义键,而忘记将其添加到 Accent
,它将使用默认值类型。
祝你好运!
我正在转换应用程序以使用 MahApps 颜色和画笔资源,以允许我们以编程方式更改应用程序 theme/accent。
我需要一种非常浅的强调背景颜色(将在许多地方使用,并由不同类型的控件使用),但最浅的 MahApps 颜色 ("AccentColor4") 不够浅。如果不修改 MahApps 库,是否有任何方法可以在我的应用程序中创建额外的 Color 和 Brush 资源,这些资源能够以某种方式根据当前的 MahApps 口音改变它们的颜色?
对于您的情况,我想我会根据 AccentColor4
值向我的 Accent
(也许 AccentColor5
?)添加一个新密钥。
Here you can find a ThemeManagerHelper
class made by punker76,这可能会帮助您从 AccentColor4
计算出 AccentColor5
(参见 CreateAppStyleBy
方法)。
我也做了这个,这应该会让你的生活更轻松:
private void AddKeyForCurrentAccent(object key, object value, bool changeAccentImmediately = false)
{
Tuple<MahApps.Metro.AppTheme, MahApps.Metro.Accent> currentAppStyle = MahApps.Metro.ThemeManager.DetectAppStyle(Application.Current);
if(currentAppStyle.Item2.Resources.Contains(key))
{
currentAppStyle.Item2.Resources.Remove(key);
}
currentAppStyle.Item2.Resources.Add(key, value);
if(changeAccentImmediately)
{
var accentName = string.Format("CustomTheme.xaml");
CreateAccentFrom(accentName, currentAppStyle.Item2.Resources);
MahApps.Metro.ThemeManager.ChangeAppStyle(Application.Current, MahApps.Metro.ThemeManager.GetAccent(accentName), currentAppStyle.Item1);
}
}
private void CreateAccentFrom(string accentName, ResourceDictionary resourceDictionary)
{
var fileName = System.IO.Path.Combine(System.IO.Path.GetTempPath(), accentName);
using (var writer = System.Xml.XmlWriter.Create(fileName, new System.Xml.XmlWriterSettings { Indent = true }))
{
System.Windows.Markup.XamlWriter.Save(resourceDictionary, writer);
writer.Close();
}
resourceDictionary = new ResourceDictionary() { Source = new Uri(fileName, UriKind.Absolute) };
var newAccent = new MahApps.Metro.Accent { Name = accentName, Resources = resourceDictionary };
MahApps.Metro.ThemeManager.AddAccent(accentName, newAccent.Resources.Source);
}
AddKeyForCurrentAccent
将在应用程序的当前 Accent
中添加(或替换 - 如果它已经存在)一个键。
如果 changeAccentImmediately
设置为 true,它将创建一个新文件并保存新的 Accent
(使用 inserted/replaced 键)并将其设置为 Accent
申请
提示:您可以add/replace所有您想要的键并仅在最后一个键上将changeAccentImmediately
设置为true(这应该会提高性能)。
这样使用:
AddKeyForCurrentAccent("AccentColor5", Brushes.Pink); // Does not replace the accent immediately (so changes are not visible) - works faster
// AND/OR
AddKeyForCurrentAccent("AccentColor5", Brushes.HotPink, true); // Will update the UI
重要提示:请注意,如果您使用自定义键,而忘记将其添加到 Accent
,它将使用默认值类型。
祝你好运!