信息系统开发平台OpenExpressApp - 支持WPF主题样式
OpenExpressApp中有一个项目【OpenExpressApp.Module.WPF.Style】,它作为以后UI样式扩展用,以前只是放在那里,其实没有做什么工作,主要也就是告诉大家后期会增加主题样式。前期做框架、做引擎时,由于侧重点不一样,所以有时经常被人说做出来的东西真丑:)所以最近就花了两天把样式扩展加进来了。目前主要从网上下载了微软的一些样式,还没有扩充OEA内部控件的样式,界面如下图:
ThemeManager
在【OpenExpressApp.Module.WPF.Style】中有一个ThemeManager.cs单元,这是主题管理的唯一一个类,其余都是各个主题的样式文件。这些都是从网上下载的,由于比较简单,就不做具体介绍了,只把代码附上:

public static class ThemeManager
{
public static ResourceDictionary GetThemeResourceDictionary(string theme)
{
if (theme != null)
{
// Assembly assembly = Assembly.LoadFrom("OpenExpressApp.Module.WPF.Style");
string packUri = String.Format(@"/OpenExpressApp.Module.WPF.Style;component/{0}/Theme.xaml", theme);
return Application.LoadComponent(new Uri(packUri, UriKind.Relative)) as ResourceDictionary;
}
return null;
}
public static string[] GetThemes()
{
string[] themes = new string[]
{
"朴素","朦胧蓝","ExpressionDark", "ExpressionLight", "RainierOrange", "RainierPurple", "RainierRadialBlue",
"ShinyBlue", "ShinyRed", "ShinyDarkTeal", // "ShinyDarkGreen",
"ShinyDarkPurple",
"DavesGlossyControls", "WhistlerBlue", "BureauBlack", "BureauBlue", "BubbleCreme",
"UXMusingsRed", "UXMusingsGreen", "UXMusingsRoughRed", "UXMusingsRoughGreen", "UXMusingsBubblyBlue"
};
return themes;
}
public static void ApplyTheme(this Application app, string theme)
{
ResourceDictionary dictionary = ThemeManager.GetThemeResourceDictionary(theme);
if (dictionary != null)
{
app.Resources.MergedDictionaries.Clear();
app.Resources.MergedDictionaries.Add(dictionary);
}
}
public static void ApplyTheme(this ContentControl control, string theme)
{
ResourceDictionary dictionary = ThemeManager.GetThemeResourceDictionary(theme);
if (dictionary != null)
{
control.Resources.MergedDictionaries.Clear();
control.Resources.MergedDictionaries.Add(dictionary);
}
}
#region Theme
/// <summary>
/// Theme Attached Dependency Property
/// </summary>
public static readonly DependencyProperty ThemeProperty =
DependencyProperty.RegisterAttached("Theme", typeof(string), typeof(ThemeManager),
new FrameworkPropertyMetadata((string)string.Empty,
new PropertyChangedCallback(OnThemeChanged)));
/// <summary>
/// Gets the Theme property. This dependency property
/// indicates ....
/// </summary>
public static string GetTheme(DependencyObject d)
{
return (string)d.GetValue(ThemeProperty);
}
/// <summary>
/// Sets the Theme property. This dependency property
/// indicates ....
/// </summary>
public static void SetTheme(DependencyObject d, string value)
{
d.SetValue(ThemeProperty, value);
}
/// <summary>
/// Handles changes to the Theme property.
/// </summary>
private static void OnThemeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
string theme = e.NewValue as string;
if (theme == string.Empty)
return;
ContentControl control = d as ContentControl;
if (control != null)
{
control.ApplyTheme(theme);
}
}
#endregion
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架