фона: Я создаю приложение WPF с помощью MVVM, и с помощью DI контейнера строить свои ViewModelsФайл app.xaml не обрабатывается, если мое приложение не устанавливает StartupUri?
Моего 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; компонент/MainWindow.xaml» Линия 8 Позиция 45.
Насколько я могу судить, раздел <Application.Resources>
просто не читают из файла xaml. Я могу поставить код в OnStartup добавить ресурс программно, как это:
Resources.BeginInit();
Resources.Add("serviceLocator", new ServiceLocator());
Resources.EndInit();
Однако это уродливое рубить, и не поможет мне, если бы я хотел, чтобы положить что-то еще в файле app.xaml позже ? :-(
Должен ли я быть зацепив другое событие есть ли способ обойти это
Это решает, спасибо! –
OMG, спасибо! Я думал, что сошел с ума – Heliac
Почему важно настроить событие из xaml? Он не работает, если настроен из конструктора ... –