Windows Phone: как программно изменить стиль приложения

В моем приложении для Windows Phone 8 у меня есть некоторые неявные стили, определенные в файле xaml по адресу /Styles/DefaultStyles.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) переключаются при изменении источника словаря.

любой другой стиль с указанным ключом и определенным дважды (с разными атрибутами) в обоих файлах не будет отражен в пользовательском интерфейсе.

так что если у меня есть эти файлы: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 ответ

Вы можете попробовать использовать подход Джеффа Уилкокса, описанный здесь: 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}"

Надеюсь это поможет.

Другие вопросы по тегам