Tło: Tworzę aplikację WPF przy użyciu MVVM i przy użyciu kontenera DI zbudować moje ViewModelsPlik App.xaml nie zostanie przeanalizowany, jeśli moja aplikacja nie ustawia StartupUri?
My App.xaml wygląda następująco:
<Application x:Class="WpfApp.App"
...xmlns etc...
StartupUri="MainWindow.xaml">
<Application.Resources>
<app:ServiceLocator x:Key="serviceLocator" />
</Application.Resources>
</Application>
MainWindow.xaml wygląda następująco:
<Window x:Class="CompositeMefWpfApp.MainWindow"
...xmlns etc... >
<Control.DataContext>
<Binding Path="MainWindowViewModel" Source="{StaticResource serviceLocator}" />
</Control.DataContext>
Teraz wszystko działa dobrze, ale StartupUri
jest zakodowane na stałe w XAML, którego nie chcę.
Po kierunkiem kilku blogposts i artykułów znalazłem, usunąłem StartupUri
i próbowali stworzyć MainWindow
zaczepiając OnStartup
w App.xaml.cs, tak:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
new MainWindow().Show();
}
Problem polega na tym, awarii aplikacji podczas próby wyświetlenia okna, z tym wyjątkiem:
Nie można odnaleźć zasobu o nazwie "{serviceLocator}". W nazwach zasobów rozróżniana jest wielkość liter. Błąd na obiekcie „” w pliku System.Windows.Data.Binding znaczników „WpfApp; komponent/mainwindow.xaml” linia 8 miejsce 45.
O ile mogę powiedzieć, sekcja <Application.Resources>
jest po prostu nie do odczytania z pliku xaml. Mogę umieścić jakiś kod w OnStartup dodać zasób programowo tak:
Resources.BeginInit();
Resources.Add("serviceLocator", new ServiceLocator());
Resources.EndInit();
Jednak to brzydki hack, i nie może mi pomóc, gdybym chciał umieścić coś innego w pliku App.xaml później ? :-(
powinienem być podpinania innego zdarzenia Czy istnieje sposób obejścia tego
To rozwiązuje, dzięki! –
OMG, dziękuję! Myślałem, że oszaleję. – Heliac
Dlaczego ważne jest skonfigurowanie zdarzenia z xaml? Nie powiedzie się, jeśli skonfigurowane z konstruktora ... –