Antecedentes: Estoy creando una aplicación de WPF usando MVVM, y el uso de un contenedor DI para construir mis ViewModelsEl archivo App.xaml no se analiza si mi aplicación no configura un StartupUri?
Mi App.xaml se ve así:
<Application x:Class="WpfApp.App"
...xmlns etc...
StartupUri="MainWindow.xaml">
<Application.Resources>
<app:ServiceLocator x:Key="serviceLocator" />
</Application.Resources>
</Application>
MainWindow.xaml se ve así:
<Window x:Class="CompositeMefWpfApp.MainWindow"
...xmlns etc... >
<Control.DataContext>
<Binding Path="MainWindowViewModel" Source="{StaticResource serviceLocator}" />
</Control.DataContext>
Ahora, todo funciona bien, pero el StartupUri
está codificado en el XAML, que no quiero.
Siguiendo la orientación de varias entradas del blog y artículos que he encontrado, he quitado el StartupUri
, y trataron de crear la MainWindow
enganchando OnStartup
en App.xaml.cs, así:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
new MainWindow().Show();
}
El problema es, la aplicación se bloquea cuando intenta mostrar la ventana, con esta excepción:
No se encuentra el recurso llamado '{serviceLocator}'. Los nombres de los recursos son sensibles a las mayúsculas Error en el objeto 'System.Windows.Data.Binding' en el archivo de anotación 'WpfApp; componente/MainWindow.xaml' Línea 8 Posición 45.
Por lo que yo puedo decir, simplemente no está siendo leído la sección <Application.Resources>
fuera del archivo xaml. Puedo poner un poco de código en el OnStartup añadir el recurso programáticamente como esto:
Resources.BeginInit();
Resources.Add("serviceLocator", new ServiceLocator());
Resources.EndInit();
Sin embargo eso es un truco feo, y no me ayuda si quería poner algo más en el archivo App.xaml más adelante ? :-(
¿Debo de enganche algún otro evento ¿hay una forma de evitar esto
Esto lo resuelve, gracias! –
¡Dios mío, gracias! Pensé que me estaba volviendo loco – Heliac
¿Por qué es importante configurar el evento desde xaml? Falla si se configura desde el constructor ... –