Mój projekt używa pliku ProjectTheme.xaml dla wszystkich okien WPF w całym projekcie. Plik ProjectTheme.xaml odwołuje się do motywu styl następującoWPF Dynamicznie zmieniaj plik zasobu i motyw
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<!-- In order to modify the project's theme, change this line -->
<ResourceDictionary Source="/MyProject;component/Themes/WPFThemes/Customized.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
Wszystko WPF Okna odwołuje WindowBase.xaml
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyProject;component/View/WindowBase.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
WindowBase.xaml referencje dostosować pasek tytułowy Bar1.xaml
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyProject;component/Themes/WPFThemes/Bar1.xaml" />
</ResourceDictionary.MergedDictionaries>
Bar1 .xaml references ProjectTheme.xaml
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyProject;component/ProjectTheme.xaml"/>
</ResourceDictionary.MergedDictionaries>
Więc heriarchy jest
- Window1 odwołuje WindowBase.xaml
- WindowBase odwołuje Bar1.xaml
- Bar1 odwołuje ProjectTheme.xaml
- ProjectTheme.xaml odwoływać plik zasobów prawdziwy motyw.
To działa dobrze. Teraz chcę dynamicznie zmieniać motyw projektu w czasie wykonywania bez zamykania aplikacji. Zakładając, że mam kilka plików w stylu motyw
- Customized.xaml
- Customized1.xaml
- Customized2.xaml
Moje pytanie brzmi jeśli to możliwe, aby dynamicznie aktualizować plik ProjectTheme.xaml w czasie wykonywania, aby zmienić linię z
<ResourceDictionary Source="/MyProject;component/Themes/WPFThemes/Customized.xaml" />
do
<ResourceDictionary Source="/MyProject;component/Themes/WPFThemes/Customized1.xaml" />
osiągnąć mój cel? Jeśli tak, jak to zrobić? Jeśli nie, jaki jest powód i jaki jest najlepszy (inny) sposób osiągnięcia mojego celu?
Próbowałem następujących czynności, ale żaden z nich nie działa: styl się nie zmienia.
sposób 1
Application.Current.Resources.MergedDictionaries.Clear();
Uri NewTheme = new Uri(@"/MyProject;component/Themes/WPFThemes/Customized2.xaml", UriKind.Relative);
ResourceDictionary dictionary = (ResourceDictionary)Application.LoadComponent(NewTheme);
Application.Current.Resources.MergedDictionaries.Add(dictionary);
sposób 2
Application.Current.Resources.MergedDictionaries.RemoveAt(0);
Uri NewTheme = new Uri(@"/MyProject;component/Themes/WPFThemes/Customized2.xaml", UriKind.Relative);
ResourceDictionary dictionary = (ResourceDictionary)Application.LoadComponent(NewTheme);
Application.Current.Resources.MergedDictionaries.Insert(0, dictionary);
Uwaga: W moich plikach typu prawdziwy motyw (Customized.xaml ...) Kiedyś połączenie dynamicznej zasobów i zasobów statycznych. Czy to ma znaczenie?
Z góry dziękuję.
Will, dzięki za odpowiedź. To wyjaśniało, dlaczego to nie zadziałało. Nie umieściłem zasobu w App.xaml, ponieważ mój projekt jest biblioteką klas zaprojektowaną do wywoływania przez program nie -.net. Czy w takim przypadku możliwa jest dynamiczna zmiana motywu? – Shawn
To powinno być możliwe. Nie próbowałem tego sam, ale eksperymentowałem z definiowaniem statycznego 'ResourceDictionary' w kodzie, zawierającym twoje inne' MergedDictionaries' i próbowałem zmienić to by zobaczyć czy to działa. Sądząc z innych pytań, na które patrzyłem, wygląda na to, że inni mogą sobie z tym poradzić.http: //stackoverflow.com/questions/3038423/creating-static-resource-dictionary –
Czy twoje wyjaśnienie pozwoli mi we właściwym kierunku . Dziękuję bardzo. Doceniam to. – Shawn