Изменение темы во время выполнения
У меня есть приложение WPF с темой (ShinyRed.xaml), и у меня есть кнопка, которая при нажатии меняет тему на ShinyBlue.xaml
Я загружаю тему сначала в App.xaml:
<Application.Resources>
<ResourceDictionary Source="/Themes/ShinyBlue.xaml"/>
</Application.Resources>
Как я могу это сделать?
Ответы
Ответ 1
Вот статья, которая проведет вас через нее:
http://svetoslavsavov.blogspot.com/2009/07/switching-wpf-interface-themes-at.html
В основном вам нужно удалить "старую" тему из словаря ресурсов, а затем объединить новую. В приведенной выше статье показано, как сделать это изменение очень простым.
Ответ 2
Как вы могли это сделать:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary x:Name="ThemeDictionary">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Themes/ShinyRed.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
<!-- ... -->
public partial class App : Application
{
public ResourceDictionary ThemeDictionary
{
// You could probably get it via its name with some query logic as well.
get { return Resources.MergedDictionaries[0]; }
}
public void ChangeTheme(Uri uri)
{
ThemeDictionary.MergedDictionaries.Clear();
ThemeDictionary.MergedDictionaries.Add(new ResourceDictionary() { Source = uri });
}
//...
}
В вашем методе изменения:
var app = (App)Application.Current;
app.ChangeTheme(new Uri("New Uri here"));
Ответ 3
Im, используя следующую команду для установки темы во время выполнения:
Application.Current.Resources.Source = new Uri("/Themes/ShinyRed.xaml", UriKind.RelativeOrAbsolute);
Ответ 4
H.B. ответ не сработал у меня, я должен был это сделать (работает, тестировался):
Uri dictUri = new Uri(@"/Resources/Themes/MyTheme.xaml", UriKind.Relative);
ResourceDictionary resourceDict = Application.LoadComponent(dictUri) as ResourceDictionary;
Application.Current.Resources.MergedDictionaries.Clear();
Application.Current.Resources.MergedDictionaries.Add(resourceDict);
Довольно это:
// Place in App.xaml.cs
public void ChangeTheme(Uri uri)
{
ResourceDictionary resourceDict = Application.LoadComponent(uri) as ResourceDictionary;
Application.Current.Resources.MergedDictionaries.Clear();
Application.Current.Resources.MergedDictionaries.Add(resourceDict);
}
// Example Usage (anywhere in app)
private void ThemeRed_Click(object sender, RoutedEventArgs e)
{
var app = App.Current as App;
app.ChangeTheme(new Uri(@"/Resources/Themes/RedTheme.xaml", UriKind.Relative));
}
Ответ 5
App.xaml
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Themes/Font.xaml" />
<ResourceDictionary Source="Themes/Light.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
В вашем коде:
> Application.Current.Resources.MergedDictionaries[1].Source = new Uri("Themes/Dark.xaml", UriKind.RelativeOrAbsolute);
вы можете проверить это, чтобы убедиться, что ничего не растет
Application.Current.Resources.MergedDictionaries.Count.ToString();