在我的Windows Phone 8应用程序中,我在 /Styles/DefaultStyles.xaml
位置的xaml文件中定义了一些隐式样式我有一个类似的文件,但有不同的颜色,字体等......在 /Styles/GreenStyles.xaml 中定义。
我在App.xaml中引用了默认样式文件,如下所示:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles/DefaultStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
我想让我的应用程序以编程方式从其他样式文件(GreenStyles)切换其隐式样式。
我怎样才能做到这一点?
**
更新
我管理如下更改资源字典的来源:
ResourceDictionary style = App.Current.Resources.MergedDictionaries.ToList()[0];
string source = String.Format("/ApplicationName;component/Styles/GreenStyles.xaml");
style.Source = new Uri(source, UriKind.Relative);
注意:必须像这样编写单词组件以避免异常
现在我有一个问题: 只有隐式样式(没有 x:Key 属性的那些)才会在字典来源发生变化时切换。
具有指定键并且在两个文件中定义两次(具有不同属性)的任何其他样式将不会反映在UI中。
所以,如果我有这些文件: 的 DefaultStyles.xaml:
<Style x:Key="MainGrid" TargetType="Grid">
<Setter Property="Background" Value="Red"/>
</Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Red"/>
<Setter Property="FontSize" Value="24"/>
</Style>
</ResourceDictionary>
并: GreenStyles.xaml:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone">
<Style x:Key="MainGrid" TargetType="Grid">
<Setter Property="Background" Value="Green"/>
</Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Green"/>
<Setter Property="FontSize" Value="24"/>
</Style>
</ResourceDictionary>
我将源切换为指向 GreenStyles.xaml ,任何格式为 MainGrid 的网格仍然具有红色的背景。
这可能是什么原因?
答案 0 :(得分:0)
您可以尝试使用Jeff Wilcox在此处描述的方法:http://www.jeff.wilcox.name/2012/01/phonethememanager/
此处描述了Silverlight的替代方法,我不确定这是否适用于Windows Phone(尽管它们共享一些代码库): http://silverlightips.wordpress.com/2010/04/29/change-themestyle-using-merged-dictionaries/
如果你有一个大型的应用程序,你可能会考虑另一个选项(让我发疯)
这两种方式都不容易<Button Style="{Binding Locator.Theme, Converter={StaticResource StyleThemeConverter}, ConverterParameter=RefreshButtonStyle}"
希望这有帮助。