Головные боли при настройке тематических ресурсов из c # (Windows Phone) - PullRequest
1 голос
/ 11 декабря 2010

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

В моем коде инициализации приложения я обнаруживаюПользовательская тема и цвет акцента затем загружают соответствующий словарь ресурсов, темный, светлый и т. д. Я добавляю словарь ресурсов в коллекцию App.Current.Resources.MergedDictionaries.

Проблема возникает, когда я хочу сослаться на значение в (динамически загружаемом) из моего приложения.В приведенном ниже примере ключ «DefaultBackgroundImageOpacity».По какой-то причине значения в ResourceDictionary, которые я загружаю в коллекцию MergedDictionaries, никогда не обнаруживаются, когда происходит анализ App.Xaml.Я играл с загрузкой ресурсов, прежде чем я вызову InitializeComponent () и после.Ни один из них, похоже, не решил проблему.

Есть идеи?

// Simplified version of adding some xaml...
// Note I'm loading the key "DefaultBackgroundImageOpacity"
this.Resources.MergedDictionaries.Clear();

var myTestXaml = "<ResourceDictionary xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' xmlns:System='clr-namespace:System;assembly=mscorlib'> <System:Double x:Key='DefaultBackgroundImageOpacity'>0.2</System:Double></ResourceDictionary>";

this.Resources.MergedDictionaries.Add((ResourceDictionary)XamlReader.Load(myTestXaml));

// This always fails saying that the key "DefaultBackgroundImageOpacity"
// can not be foudnd - even though it was loaded just above
InitializeComponent();

// Phone-specific initialization
InitializePhoneApplication();

1 Ответ

0 голосов
/ 14 декабря 2010

Я подозреваю, что ваш App.Xaml содержит что-то вроде этого: -

<Application.Resources>
   <ResourceDictionary>
       <ResourceDictionary.MergedDictionaries>
          <ResourceDictionary Source="/somedictionary.xaml" />
          ...
       </ResourceDictionary.MergedDictionaries>
       ...
  </ResourceDictionary>
</Application.Resources>

Если это так, то InitializeComponent заменит значение по умолчанию ResourceDictionary, которым вы манипулировали в своем коде, следовательно, ваши изменения вMergeDictionaries не будет присутствовать, так как на этот экземпляр ResourceDictionary больше нет ссылок.

Если вы не настраиваете MergedDictionaries в App.Xaml, убедитесь, что вы добавляете ресурсы непосредственно в Applicaiton.Resources и не создают новый экземпляр ResourceDictionary в xaml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...