visual studio nacio examples estilos donde documentacion diseño cliente application aplicación aplicacion wpf xaml resources startup

studio - estilos wpf



El archivo App.xaml no se analiza si mi aplicación no configura un StartupUri? (4)

Antecedentes: estoy creando una aplicación WPF usando MVVM y usando un contenedor DI para construir mis ViewModels

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 esto funciona bien, pero el StartupUri está codificado en el XAML, lo que no quiero.
Siguiendo la guía de varios artículos de blog y artículos que encontré, StartupUri el StartupUri e intenté crear MainWindow conectando OnStartup en App.xaml.cs, así:

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

El problema es que la aplicación se bloquea al intentar mostrar la ventana, con esta excepción:

No se puede encontrar 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 marcado ''WpfApp; component / mainwindow.xaml'' Line 8 Position 45.

Por lo que puedo decir, la sección <Application.Resources> simplemente no está siendo leída del archivo xaml. Puedo poner un código en OnStartup para agregar el recurso programáticamente así:

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

Sin embargo, ese es un hack feo, y no me ayuda si quisiera poner algo más en el archivo app.xaml más adelante :-(

¿Debería enganchar algún otro evento? ¿Hay alguna forma de evitar esto?


En lugar de sobreescribir OnStartup, intente usar un evento en su lugar:

<Application x:Class="My.App" xmlns="..." Startup="Application_Startup" ShutdownMode="OnExplicitShutdown"> <Application.Resources> <app:ServiceLocator x:Key="serviceLocator" /> </Application.Resources> </Application>

Código detrás:

public partial class App : Application { public App() { } private void Application_Startup(object sender, StartupEventArgs e) { // TODO: Parse commandline arguments and other startup work new MainWindow().Show(); } }



Me encontré con un problema similar / este mismo. Hay un error de generación de código VS donde el código necesario para conectar <Application.Resources> al resto del programa a veces no se inserta cuando <Application.Resources> contiene solo una entrada y no tiene un atributo StartupUri .

Detalles: http://bengribaudo.com/blog/2010/08/19/106/bug-single-application-resources-entry-ignored (descargo de responsabilidad - puntos de enlace a mi blog)


Para evitar este error conocido también puede agregar recursos programáticamente.

var rd = new ResourceDictionary() rd.Source = new Uri("pack://application:,,,/Resources;component/Colors.xaml"); Resources.MergedDictionaries.Add(rd);

Este código se puede colocar dentro del construtor para la clase de la App .