Windows Phone:如何以编程方式更改应用程序样式

时间:2013-02-28 10:24:39

标签: xaml windows-phone-8 windows-phone

在我的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 的网格仍然具有红色的背景。

这可能是什么原因?

1 个答案:

答案 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}"

希望这有帮助。