gpt4 book ai didi

wpf - 是否可以使用 WPF 主题为可以在运行时更改的应用程序包含多个皮肤?

转载 作者:行者123 更新时间:2023-12-04 03:24:57 24 4
gpt4 key购买 nike

WPF 允许控件库为不同的系统主题提供不同的资源字典,本质上允许应用程序匹配操作系统选择的视觉主题(Aero、Luna 等)。

我想知道我是否可以在我的应用程序中包含多个主题资源字典并利用框架内的一些现有主题支持。这应该适用于我自己的主题名称,理想情况下允许用户更改主题,从而在运行时更改应用程序的外观。即使这只是一个配置设置,它仍然很有趣。

最佳答案

这是我在支持主题的应用程序中使用的一段代码。在这个例子中,我有两个主题(默认和经典 XP)。主题资源分别存储在 DefaultTheme.xaml 和 ClassicTheme.xaml 中。

这是我的 App.xaml 中的默认代码

<Application ...>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ArtworkResources.xaml" />
<ResourceDictionary Source="DefaultTheme.xaml" />
</ResourceDictionary.MergedDictionaries>

<Style x:Key="SwooshButton" TargetType="ButtonBase">
<!-- style setters -->
</Style>

<!-- more global styles -->
</ResourceDictionary>
</Application.Resources>
</Application>

然后在 App.xaml 后面的代码中,我有以下方法来允许更改主题。基本上,您要做的是清除资源词典,然后使用新主题重新加载词典。
    private Themes _currentTheme = Themes.Default;
public Themes CurrentTheme
{
get { return _currentTheme; }
set { _currentTheme = value; }
}

public void ChangeTheme(Themes theme)
{
if (theme != _currentTheme)
{
_currentTheme = theme;
switch (theme)
{
default:
case Themes.Default:
this.Resources.MergedDictionaries.Clear();
AddResourceDictionary("ArtworkResources.xaml");
AddResourceDictionary("DefaultTheme.xaml");
break;
case Themes.Classic:
this.Resources.MergedDictionaries.Clear();
AddResourceDictionary("ArtworkResources.xaml");
AddResourceDictionary("ClassicTheme.xaml");
break;
}
}
}

void AddResourceDictionary(string source)
{
ResourceDictionary resourceDictionary = Application.LoadComponent(new Uri(source, UriKind.Relative)) as ResourceDictionary;
this.Resources.MergedDictionaries.Add(resourceDictionary);
}

使用这种方法还需要记住的是,任何利用主题的样式都需要具有动态资源。例如:
<Window Background="{DynamicResource AppBackgroundColor}" />

关于wpf - 是否可以使用 WPF 主题为可以在运行时更改的应用程序包含多个皮肤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/844388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com