класс.

стория: я создаю приложение WPF с использованием MVVM и использую DI-контейнер для построения моих ViewModels

Мой App.xaml выглядит так:

<Application x:Class="WpfApp.App"
    ...xmlns etc...
    StartupUri="MainWindow.xaml">
    <Application.Resources>
        <app:ServiceLocator x:Key="serviceLocator" />
    </Application.Resources>
</Application>

MainWindow.xaml выглядит так:

<Window x:Class="CompositeMefWpfApp.MainWindow"
    ...xmlns etc... >
    <Control.DataContext>
        <Binding Path="MainWindowViewModel" Source="{StaticResource serviceLocator}" />
    </Control.DataContext>

Теперь все это прекрасно работает, ноStartupUri жестко запрограммирован в XAML, который я не хочу.
Следуя указаниям нескольких постов и статей, которые я нашел, я удалилStartupUriи попытался создатьMainWindow подключивOnStartup в App.xaml.cs, вот так:

protected override void OnStartup( StartupEventArgs e )
{
    base.OnStartup(e);
    new MainWindow().Show();
}

Проблема в том, что приложение вылетает при попытке показать окно, за исключением этого:

Не удается найти ресурс с именем '{serviceLocator}'. Имена ресурсов чувствительны к регистру. Ошибка в объекте «System.Windows.Data.Binding» в файле разметки «WpfApp; component / mainwindow.xaml» Строка 8, позиция 45.

Насколько я могу судить,<Application.Resources> раздел просто не читается из файла xaml. Я могу поместить некоторый код в OnStartup, чтобы добавить ресурс программно следующим образом:

Resources.BeginInit();
Resources.Add("serviceLocator", new ServiceLocator());
Resources.EndInit();

Однако это ужасный хак, и он не поможет мне, если я захочу добавить что-то еще в файл app.xaml позже :-(

Должен ли я подключить какое-то другое событие? Это можно обойти?

Ответы на вопрос(4)

Ваш ответ на вопрос