App.el archivo xaml no se analiza si mi aplicación no establece un StartupUri?


Fondo: Estoy creando una aplicación WPF usando MVVM, y usando un contenedor DI para compilar mis ViewModels

Mi Aplicación.xaml se ve así:

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

Ventana principal.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, que no quiero.
Siguiendo la guía de varios blogposts y artículos que encontré, eliminé el StartupUri, y traté de crear el MainWindow enganchando OnStartup en la aplicación.XAML.cs, así:

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

El problema es decir, 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 recursos distinguen entre mayúsculas y minúsculas. Error en el sistema del objeto.Windows.Datos.Enlace 'en archivo de marcado' WpfApp;componente / ventana principal.xaml ' Línea 8 Posición 45.

Por lo que puedo decir, la sección <Application.Resources> simplemente no se está leyendo del archivo xaml. Puedo poner un poco de código en el OnStartup para agregar 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 la aplicación.archivo xaml más adelante: - (

¿Debería estar enganchando algún otro evento? ¿Hay alguna manera de evitar esto?

Author: H.B., 2009-02-13

4 answers

En lugar de sobrescribir 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();
    }
}
 39
Author: Nidonocu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-17 02:01:12

La solución más simple es la definición de x: Name :

<Application x:Name="App" ...
    <Application.Resources>
        ...
    </Application.Resources>
</Application>

Más información: http://connect.microsoft.com/VisualStudio/feedback/details/472729/wpf-cannot-find-resource-defined-in-the-app-xaml-file

 19
Author: jbe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-09 15:38:19

Me he encontrado 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 link enlaces a mi blog)

 12
Author: Ben Gribaudo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-27 21:15:46

Para evitar este error de conocimiento también puede agregar recursos mediante programación.

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 App.

 1
Author: user1412631,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-23 15:35:24