简体   繁体   中英

Windows Phone: how to change the Application style programmatically

In my Windows Phone 8 app, I have some implicit styles defined in a xaml file at the location /Styles/DefaultStyles.xaml

I have a similar file but with different colors, fonts, etc ... defined at /Styles/GreenStyles.xaml .

I reference the default style file in my App.xaml as follows :

<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary   Source="Styles/DefaultStyles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

I want to make my app switch its implicit styles from the other styles file (GreenStyles) programmatically.

How can I achieve this ?

**

UPDATE:

I manged to change the source of the resource dictionary as follows:

ResourceDictionary style = App.Current.Resources.MergedDictionaries.ToList()[0];
            string source = String.Format("/ApplicationName;component/Styles/GreenStyles.xaml");
            style.Source = new Uri(source, UriKind.Relative);

Note: the word component must be written like that to avoid exceptions

Now I have an issue: only the Implicit styles (the ones that do not have a x:Key attribute) are switched when the source of the dictionary changes.

any other style with a specified key and defined twice (with different attributes) in both files, will not be reflected in the UI.

so if I have these files: 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>

And: 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>

and I switched the source to point to GreenStyles.xaml , any Grid with the style MainGrid will still have it's background to Red .

What can be the reason for this ?

You can try using the approach Jeff Wilcox described here: http://www.jeff.wilcox.name/2012/01/phonethememanager/

Alternative approach is described here for Silverlight and I'm not sure if this will work on Windows Phone (though they share some codebase): http://silverlightips.wordpress.com/2010/04/29/change-themestyle-using-merged-dictionaries/

Both of the ways are not easy if you have a large app and you may consider another option like (call me crazy)

<Button Style="{Binding Locator.Theme, Converter={StaticResource StyleThemeConverter}, ConverterParameter=RefreshButtonStyle}"

Hope this helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM