Исключение при добавлении ResourceDictonary во время выполнения - PullRequest
3 голосов
/ 09 ноября 2010

Я пытаюсь разработать способ переключения стиля приложения Windows Phone 7 в зависимости от настроек.Стили выглядят так:

  • основные стили разделены и определены в WP7Style_Dark.xaml и WP7Style_Light.xaml
  • остальные стили объявлены в Styles.xaml

Я использую следующий код для подключения тем в App.xaml.cs:

var dictionaries = Resources.MergedDictionaries;
dictionaries.Clear();
string source = String.Format("/CommonUI;component/Resources/{0}.xaml", value == AppStyleSet.Light ? "WP7Style_Light" : "WP7Style_Dark");
//base styles
var themeStyles = new ResourceDictionary {Source = new Uri(source, UriKind.Relative)};
dictionaries.Add(themeStyles);
var generalStyles = new ResourceDictionary();
generalStyles.Source = new Uri("/CommonUI;component/Resources/Styles.xaml",UriKind.Relative);
dictionaries.Add(generalStyles);

При выполнении, настройка generalStyles.Source выдает исключение (которое является System.Exception, заявляющим 'Неопределенная ошибка').Я обнаружил, что исключение исчезает, если я очищаю Styles.xaml, но это, конечно, не решение.

Что мне делать?

Обновление 2: Винт трассировки стека, вот проблема сужается:

Стили темы определяют цвета темы.Общие стили продолжают нормально загружаться, пока не встретят привязку, как этот

... <Setter Property="Color" Value="{StaticResource HighlightColor}" />

Итак, StaticResource не удается разрешить и выдает исключение.Можно ли этого как-то избежать?

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

Проблема, с которой я столкнулся при таком подходе, заключается в том, что существует некоторая асинхронность того, как словарь ресурсов загружается из URL-адреса в свойстве Source. Следовательно, когда один словарь использует {StaticResource key}, где key находится в предыдущем словаре, он может потерпеть неудачу.

Одним из решений будет извлечение Xaml с использованием Application.GetResourceStream и StreamReader. Затем использовать XamlReader для построения ResourceDictionary. Таким образом, вы можете быть уверены, что зависимые словари могут найти нужные им статические ресурсы.

Обратите внимание, что вам необходимо убедиться, что вы добавили каждый словарь, чтобы он был частью дерева Application.Resources, перед загрузкой дополнительных зависимых словарей.

1 голос
/ 09 ноября 2010

WP7 основан на Silverlight 3+, и по умолчанию невозможно создать новый словарь ресурсов в коде, поэтому вы получаете System.Exception с указанием «UnspecifiedError».

Обходной путьпросто создайте ResourceDictionary, как если бы вы использовали Silverlight3 - следуйте этому руководству .

Я надеюсь, что это решит проблему.

...