我有一个较旧的Winforms应用程序,现在我在其中将WPF用于所有新内容(托管在ElementHost
中)
我希望在运行时更改样式(用于主题化)。
我的视图中包含以下资源字典。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Themes/NightTheme.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
例如,在我的一个视图(UserControl)中,我将看到以下内容...
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../AppStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
我还具有以下代码,用于将出口(例如NightTheme.xaml
)与另一个交换...
public static void ChangeTheme(AppTheme theme)
{
try
{
if (theme == m_currentTheme)
{
return;
}
ResourceDictionary appStyles = new ResourceDictionary();
appStyles.Source = new Uri("/MyApp.UserInterface.WPF;component/AppStyles.xaml", UriKind.RelativeOrAbsolute);
appStyles.MergedDictionaries.Clear();
ResourceDictionary newTheme = new ResourceDictionary();
newTheme.Source = new Uri(string.Format("/MyApp.UserInterface.WPF;component/Themes/{0}Theme.xaml", theme.ToString()), UriKind.RelativeOrAbsolute);
appStyles.MergedDictionaries.Add(newTheme);
m_currentTheme = theme;
}
catch (Exception ex)
{
TraceError(ex.ToString());
}
}
我可以看到所有词典都在加载,并且可以看到新的合并字典包含新值,但是,没有UI更新。
我什至尝试将其中一个元素更改为DynamicResource,即
<Grid Grid.ColumnSpan="2" Background="{DynamicResource CommandBarBackgroundColour}">
但这没什么不同。
我读过的其他地方说,像我上面提到的那样,在ResourceDictionary
上删除然后添加新的MergedDictionaries
应该更新UI(即使是从StaticResources),但在我看来,它不是。
有人知道为什么这不起作用吗?我该怎么做才能更新主题?
在此先感谢您的帮助!
答案 0 :(得分:0)
您必须将字典分配给SOMETHING,无论是全局应用程序资源还是当前视图的资源。现在,您的样式只是在内存中浮动,什么也不做。您至少必须这样做(如果样式是全局样式):
git clone --recursive https://github.com/gnuradio/gnuradio.git
或更妙的是:
Application.Current.Resources.MergedDictionaries.Add(myNewResourceDict);
此外,您还必须使用Application.Current.Resources.MergedDictionaries.Add(newTheme);
,Application.Current.Resources.MergedDictionaries
或Clear
从Remove
中删除以前的字典。
您现在所做的事情既太多又不够:
RemoveAt