Проблема в том, что silverlight упрощает загрузку словарей ресурсов, так что несколько словарей могут загружаться параллельно.В результате, когда один словарь имеет зависимость от другого, эта зависимость может быть не готова вовремя.
Поскольку ResourceDictionary
не имеет встроенных средств для описания взаимозависимостей или события, указывающего, когда он был загруженЕдинственное решение, к которому я смог прийти, - это самостоятельно управлять загрузкой словарей.
Вот функция, которую вы можете добавить в свой файл App.xaml.cs для «ручной» загрузки словаря ресурсов.: -
private void LoadResource(Uri uri)
{
var info = Application.GetResourceStream(uri);
string xaml;
using (var reader = new StreamReader(info.Stream))
{
xaml = reader.ReadToEnd();
}
ResourceDictionary result = XamlReader.Load(xaml) as ResourceDictionary;
if (result != null)
{
Resources.MergedDictionaries.Add(result);
}
}
Теперь в Application_Startup
перед присвоением RootVisual
вы будете использовать код, подобный следующему: -
LoadResource(new Uri"Assets/Styles/Common.xaml", UriKind.Relative));
LoadResource(new Uri("Assets/Styles/TextBoxStyle.xaml", UriKind.Relative));
Это не будет так эффективно, как использованиеSource
свойство, но оно будет работать.Если у вас много таких словарей и только несколько «общих» словарей, которые содержат общие ресурсы, вы можете использовать эту технику для загрузки только «общих» словарей, а затем использовать: -
Resource.MergedDictionaries.Add(new ResourceDictionary() {Source = new Uri("Assets/Styles/TextBoxStyle.xaml", UriKind.Relative)});
Для других словарей, которые не используютне имеют взаимозависимости друг от друга.