UWP ResourceDictionary не загружается, когда я добавляю к нему второй объект

У меня есть приложение UWP для Windows 10 с подключенным MVVM Light. Я храню ViewModelLocator в App.Resources. Когда у меня в App.Resources есть только ViewModelLocator, все работает нормально.

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

Как только я добавляю String, Converter или что-то подобное, приложение не падает, но конструктор ViewModelLocator больше не вызывается. Никаких ошибок или исключений не возникает, просто ResourceDictionary не загружается или дает сбой во время загрузки.

<Application.Resources>
    <viewModel:ViewModelLocator x:Key="Locator" />
    <x:String x:Key="SampleString">Hello</x:String>
</Application.Resources>

Если я добавляю Style, DataTemplate, Brush, Color - все работает нормально.

Раньше не замечал такого поведения на Windows Phone 8, Silverlignt или WPF. Перемещение стилей или объектов в отдельные ResourceDictionaries и загрузка их с помощью MergedDictionaries не помогло.

Я хотел бы иметь список объектов в ResourceDictionary, чтобы все конструкторы этих объектов вызывались автоматически при запуске приложения. Пожалуйста, порекомендуйте.

P.S.: Даже два одинаковых конвертера не работают, а один создается без проблем

<Application.Resources>
    <!--<viewModel:ViewModelLocator x:Key="Locator" />-->
    <converters:StringFormatConverter x:Key="StringFormat1" />
    <converters:StringFormatConverter x:Key="StringFormat2" />
</Application.Resources>

В поисках примера использования ResourceDictionary нашел аналогичный вопрос: Инициализация объединенного ResourceDictionary в приложении UWP


person Alex Sorokoletov    schedule 25.12.2015    source источник


Ответы (2)


Это все из-за ленивой инициализации. Я провел несколько экспериментов и понял эту картину. Надеюсь, вы уловите идею. http://screencast.com/t/mxyBGBDuZ

person vladimir khozeyev    schedule 26.01.2016

Попробуйте добавить их в словарь ресурсов, как это

<Application.Resources>
    <ResourceDictionary>
        <viewModels:ViewModelLocator x:Key="Locator"/>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="XAMLResources/Styles.xaml" />                
            <ResourceDictionary Source="XAMLResources/DataTemplates.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Если вы хотите взглянуть на полный пример, фрагмент кода находится в этом репозитории на GitHub https://github.com/AppCreativity/Kliva

Вы заметите, что мы добавили наши преобразователи в Styles.xaml, и это работает нормально...

person Depechie    schedule 25.12.2015
comment
Я уже пробовал такой подход. Связанный вопрос гласит, что если вы вызываете эти ресурсы по ключу, они инициализируются. Однако это не объясняет, почему ctor Locator не вызывается, пока вы не сошлетесь на него в первый раз. - person Alex Sorokoletov; 26.12.2015
comment
На самом деле, ваша точная настройка работает, и ViewModelLocator создается без вызовов. Спасибо! - person Alex Sorokoletov; 26.12.2015
comment
Рад, что смог помочь :) - person Depechie; 26.12.2015