Скинирование Windows Phone (7.1) на основе текущей темы пользователя

Короче говоря, мои вопросы: как переключать ResourceDictionaries в приложении WP7.1? Есть ли более простой способ, чем тот, который я пытаюсь сделать?

Подробности...

В проекте Windows Phone 7 мне нужно заменить ресурсы приложения в соответствии с пользовательской темой (светлая/темная). В двух словах идея очевидна:
    а) создать переменную ResourceDictionary
    б) получить соответствующие файлы ресурсов стилей и кистей в соответствии с текущей темой
    в) добавить вышеуказанные ресурсы в Application.Current. Resources.MergeDictionaries

Вот что я делаю:

1) Структура папок для ресурсов в проекте «Просмотр»:
    Resources
        Dark.xaml
                                     Styles.xaml
        Light
             Brushes.xaml
бр>

2) Стили в двух файлах Brushes.xaml имеют одинаковые ключи. То же самое с Styles.xaml.

3) При первой попытке (при условии, что выбрана светлая тема) я получаю "неопределенную ошибку" во второй строке.

var uriPath = "Resources/Light/Brushes.xaml"; 
var brushes = new ResourceDictionary {Source = new Uri(uriPath, UriKind.Relative)};
dic.MergedDictionaries.Add(brushes);

(К вашему сведению, я пробовал с действиями сборки ресурсов, страниц и контента)

4) Моя вторая попытка вселяет в меня надежду, так как мне удалось вставить Brushes.xaml в MergedDictionaries приложения:

string xaml;
var uriPath = "Resources/Light/Brushes.xaml";
var brushesUri = new Uri(uriPath, UriKind.Relative);
var brushesStream = Application.GetResourceStream(brushesUri);
using (var brushesStreamReader = new StreamReader(brushesStream.Stream))
    xaml = brushesStreamReader.ReadToEnd();
var dic = new ResourceDictionary();
dic.MergedDictionaries.Add((ResourceDictionary)XamlReader.Load(xaml));

5) Чтобы щеткиStreamReader не были null в приведенном выше коде, я должен установить для файлов xaml значение «Содержимое». (почему?)

6) Вторая проблема с моим кодом на шаге 4 связана с попыткой сделать то же самое с Styles.xaml. Я получаю "Failed to assign to property 'System.Windows.ResourceDictionary.Source'" в последней строке (dic.MergedDictionaries.Add...). Возможно, это связано с тем, что Styles.xaml добавляет Brushes.xaml в свои собственные MergedDictionaries:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Brushes.xaml"/>
</ResourceDictionary.MergedDictionaries>

Это?
Спасибо!


person Gus Cavalcanti    schedule 30.11.2012    source источник


Ответы (2)


В этом случае вы можете просто взять кисть темы и проанализировать ее. Бывший:

private Color lightThemeBackground = Color.FromArgb(255, 255, 255, 255); 
private Color darkThemeBackground = Color.FromArgb(255, 0, 0, 0);  


public bool IsLightTheme()
{
     SolidColorBrush backgroundBrush = Application.Current.Resources["PhoneBackgroundBrush"] as SolidColorBrush;   
     if (backgroundBrush.Color == lightThemeBackground) { 
          // you are in the light theme
          return true;
     } 
     else { 
          // you are in the dark theme
          return false;
     }
}
person dotMorten    schedule 18.01.2013

Вы не должны этого делать. Просто используйте системные кисти, чтобы получить все цвета темы. Вот хороший обзор этих кистей: http://msdn.microsoft.com/en-us/library/windowsphone/develop/ff769552.aspx#BKMK_BrushResources

person dotMorten    schedule 30.11.2012
comment
спасибо, но это не ответ на мой вопрос. Использование системных кистей очень ограничено. Что, если вы хотите отображать разные анимации или отображать элементы управления по-разному в зависимости от тем? Или просто, что, если вы хотите показать все акценты ваших визуальных элементов оттенками красного в светлом режиме и другой палитрой в темном режиме? - person Gus Cavalcanti; 30.11.2012