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}"
Надеюсь это поможет.