2009-02-12 4 views
34

Hintergrund: Ich erstelle eine WPF-Anwendung MVVM verwenden und einen DI-Container mit meinem ViewmodelsApp.xaml-Datei wird nicht analysiert, wenn meine App kein StartupUri setzt?

Mein App.xaml sieht wie folgt aufzubauen:

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

MainWindow.xaml sieht wie folgt aus:

Jetzt funktioniert das alles gut, aber die StartupUri ist fest in die XAML, die ich nicht will.
Nach Führung von mehreren Blogeinträge und Artikel fand ich, Ich entfernte die StartupUri, und versuchte, die MainWindow von OnStartup in App.xaml.cs dieses Einhaken wie zu erstellen:

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

Das Problem ist, die App stürzt ab Beim Versuch, das Fenster mit folgender Ausnahme anzuzeigen:

Die Ressource mit dem Namen '{serviceLocator}' kann nicht gefunden werden. Bei Ressourcennamen wird zwischen Groß- und Kleinschreibung unterschieden Fehler beim Objekt ‚System.Windows.Data.Binding‘ in Markup-Datei ‚WpfApp; Komponente/MainWindow.xaml‘ Linie 8 Position 45.

Soweit ich das beurteilen kann, der <Application.Resources> Abschnitt einfach nicht gelesen werden aus der XAML-Datei. Ich kann einige Code in der OnStartup setzen die Ressource programmatisch wie folgt hinzuzufügen:

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

aber das ist eine hässliche Hack, und hilft mir nicht, wenn ich etwas anderes in der app.xaml Datei setzen wollte später ? :-(

Sollte ich ein anderes Ereignis sein Einhaken gibt es eine Möglichkeit, um dieses

Antwort

38

anstatt OnStartup überschreiben, versuchen Sie stattdessen ein Ereignis mit:

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

Code hinter:

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(); 
    } 
} 
+1

Das löst es, danke! –

+1

OMG, danke! Ich dachte, ich würde verrückt werden – Heliac

+1

Warum ist es wichtig, ein Ereignis von XAML einzurichten? Es schlägt fehl, wenn von Konstruktor ... –

12

Ich habe in eine ähnliche/das gleiche Problem gerannt. Es gibt einen VS-Code-Generierungsfehler, bei dem der Code, der notwendig ist, um <Application.Resources> mit dem Rest des Programms zu verbinden, manchmal nicht eingefügt wird, wenn <Application.Resources> nur einen Eintrag enthält und kein StartupUri-Attribut besitzt.

Details: http://bengribaudo.com/blog/2010/08/19/106/bug-single-application-resources-entry-ignored(Disclaimer - Link verweist auf meinem Blog)

+2

Visual Studio 2012 mit .NET Framework 4.5 Noch hat einen Fehler – Lu55

+0

Visual Studio 2015 hat immer noch den Fehler :-(Weitere drei Stunden meines Lebens dort gegangen. –

17

Die einfachste Abhilfe ist die Definition eines x: Name des:

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

Weitere Informationen: http://connect.microsoft.com/VisualStudio/feedback/details/472729/wpf-cannot-find-resource-defined-in-the-app-xaml-file

+0

der Link ist kaputt Kann nicht einmal Problem durch die Suche finden – Lu55

+0

Hinzugefügt neue https://connect.microsoft.com/VisualStudio/feedback/details/772087/ – Lu55

+0

Diese Lösung hat für mich funktioniert und es ist die einfachste. – bignermo

1

Um diesen Fehler zu umgehen, können Sie Ressourcen auch programmatisch hinzufügen.

Dieser Code kann innerhalb des Bauelements für die Klasse App platziert werden.

Verwandte Themen