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?
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();
}
}
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
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)
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
.
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