Короче говоря, мои вопросы: как переключать 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>
Это?
Спасибо!