2015-12-17 3 views
5

Во время разработки моего приложения UWP я заметил и заинтересовал странность, которую мне трудно объяснить.Объединенный ResourceDictionary initalization в приложении UWP

Я пользователь MvvmLight и я решил добавить экземпляр ViewModelLocator ресурсов в отдельном ResourceDictionary Core.xaml которые будут ссылаться из MergedDictionaries в App.xaml. Ниже приводится содержание App.xaml:

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

Содержание Core.xaml:

<ResourceDictionary ...> 
    <viewModel:ViewModelLocator x:Key="Locator" /> 
</ResourceDictionary> 

Теперь я должен ресурсы в Core.xaml инициализируются во время InitializeComponent метод вызывает в App.xaml.cs, но когда я попытался использовать класс ServiceLocator (который установлен в конструкторе ViewMode lLocator в MvvmLight) - как это - ServiceLocator.Current.GetInstance<INavigationService>().Navigate<MainViewModel>(); - я получаю исключение, говоря:

An exception of type 'System.InvalidOperationException' occurred in 
Microsoft.Practices.ServiceLocation.dll but was not handled in user code 

Additional information: ServiceLocationProvider must be set. 

В самом деле, если я поставил точку останова в конструкторе ViewModelLocator, это не называется до окна активации. Еще более интересно - если я вручную ссылаюсь на ключ ресурса Locator (например, поставить Debug.WriteLine(Resources["Locator"]); над вызовом ServiceLocator), все работает нормально. То же самое происходит, если я переместю ресурс ViewModelLocator непосредственно в App.xaml - тогда он создается в течение IntializeComponent.

Есть ли ленивое создание объединенных ресурсных словарей в приложениях UWP? Или почему он ведет себя таким образом?

+1

Я заметил, что это странное поведение возникает, когда в вашем ResourceDictionary есть несколько объектов (не стилей). Наличие только одного ViewModelLocator полностью работает, и ctor вызывается. Мои выводы http://stackoverflow.com/questions/34466035/uwp-resourcedictionary-is-not-being-loaded-when-i-add-a-second-object-to-it –

ответ

6

В UWP не было никаких кодов (нет InitializeComponent). Поэтому любые ссылки на классы, определенные в ResourceDictionary, не будут инициализироваться напрямую.

Также не делает этого App.InitializeComponent. Ресурсные словари в UWP просто не предоставляют эту функцию - не спрашивайте меня, почему.

Вы можете легко попробовать это, пытаясь инициализировать DataTemplate в ResourceDictionary.
Это должно - к сожалению - не работать.

Однако, используя Resources["Locator"] доступ к коду за триггерами конструктор класса, и все в порядке.

Это не решение, а объяснение проблемы. Надеюсь, это вам поможет.

+0

Спасибо за объяснение! Один из способов обойти эту проблему - это добавить класс словарного кода для словаря, например, со словарями, содержащими {x: Bind}, правильно? Но я думаю, что лучше создать экземпляр ViewModelLocator вручную, так как это единственный ресурс, который нужен напрямую, поэтому он сохраняет память во время загрузки. –

+0

@MZetko Если это что-то очень центральное, вы можете его инициализировать в разделе 'Ресурсы'' App.xaml'. – Herdo

Смежные вопросы