Hi,
I'm trying to set a theme at runtime, but I see no changes in my UI. Here's what I'm trying.
switch ( theme ) { case 1: ThemeManager.CurrentTheme = ThemeManager.ThemeNameAero; break; case 2: ThemeManager.CurrentTheme = ThemeManager.ThemeNameLeaf; break; case 3: ThemeManager.CurrentTheme = ThemeManager.ThemeNameOnyx; break; case 4: ThemeManager.CurrentTheme = ThemeManager.ThemeNameOffice2k7Silver; break; default: throw new Exception(); }
But it doesn't seem to work. I've also tried getting the PrimativesXXX ResourceDictionary merged into the apps ResourceDictionary, but that doesn't work either.
The above code is in the App.xaml.cs.
Thanks
Andy
Hello Andy,
I have managed changing the current theme by creating a Style targeting the element you want to change the theme of. For example, I want to change the current theme of my XamDataGrid and I do the following:
string[ themes = ThemeManager.GetThemes();
Style myStyle = new Style();myStyle.TargetType = typeof(XamDataGrid);myStyle.Setters.Add(new Setter(XamDataGrid.ThemeProperty,themes[0]));xamDataGrid.Style = myStyle ;
Does this work in your case?
Actually you should not change the Theme in a style setter since depending on where you place the Style you can get into an invalid state since setting the Theme puts the theme resources into the control's Resources which could override the local style which had the Theme setter which removes the Theme setting and removes the resources.
The CurrentTheme of the ThemeManager is the theme that is used by controls on which you have set the Theme property to "[current]" (or ThemeManager.ThemeCurrentLiteral) so if you want to use that mechanism you have to be sure to set the Theme property as such on all the controls. With regards to putting resources into the application resources, the PrimitivesXXX resources just contain the resources for the classes in the Windows assembly so you would have to include all the resources. If you wanted to go this route then you might try using the static GetResourceSet method passing in the theme name and a grouping of "*" (or ThemeManager.AllGroupingsLiteral) and put that resource into your application's resource dictionary.
Hi andrew,
We r now using infra controls in wpf application.here we need to change our using themes at run time.I mean
we pick a theme using drop down..previous application we done by app stylist run time infra controls.is any idea to do in wpf infragistics controls.
A similar approach could probably be acheived by putting resource dictionaries into the Application's Resources (and removing the last one whenever you change to a new one). You could get the resource dictionary for a given theme using the ThemeManager.GetResourceSet method passing in ThemeManager.AllGroupingsLiteral as the grouping name. That being said, you should be aware that there is a potential memory leak in the current WPF framework when you put RDs in the application resources.