2009-02-12 3 views
34

фона: Я создаю приложение WPF с помощью MVVM, и с помощью DI контейнера строить свои ViewModelsФайл app.xaml не обрабатывается, если мое приложение не устанавливает StartupUri?

Моего App.xaml выглядит следующим образом:

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

MainWindow.xaml выглядит следующим образом:

<Window x:Class="CompositeMefWpfApp.MainWindow" 
    ...xmlns etc... > 
    <Control.DataContext> 
     <Binding Path="MainWindowViewModel" Source="{StaticResource serviceLocator}" /> 
    </Control.DataContext> 

Теперь все это работает нормально, но StartupUri жестко закодирован в XAML, чего я не хочу.
Следуя указаниям нескольких статей и · блоги, · я нашел, я удалил StartupUri, и пытались создать MainWindow зацепив OnStartup в App.xaml.cs, как это:

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

Проблема заключается в том, что приложение падает при попытке показать окно с этим исключением:

Не удается найти ресурс с именем '{serviceLocator}'. Имена ресурсов чувствительны к регистру. Ошибка в объекте «System.Windows.Data.Binding» в файле разметки «WpfApp; компонент/MainWindow.xaml» Линия 8 Позиция 45.

Насколько я могу судить, раздел <Application.Resources> просто не читают из файла xaml. Я могу поставить код в OnStartup добавить ресурс программно, как это:

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

Однако это уродливое рубить, и не поможет мне, если бы я хотел, чтобы положить что-то еще в файле app.xaml позже ? :-(

Должен ли я быть зацепив другое событие есть ли способ обойти это

ответ

38

вместо того, перекрывая OnStartup, попробуйте использовать событие вместо:

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

Код позади:

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

Это решает, спасибо! –

+1

OMG, спасибо! Я думал, что сошел с ума – Heliac

+1

Почему важно настроить событие из xaml? Он не работает, если настроен из конструктора ... –

12

У меня возникла аналогичная проблема. Там есть ошибка генерации кода VS, где код, необходимый для подключения <Application.Resources> к остальной части программы, иногда не вставлен, когда <Application.Resources> содержит только одну запись и не имеет атрибута StartupUri.

Детали: http://bengribaudo.com/blog/2010/08/19/106/bug-single-application-resources-entry-ignored(отказ от ответственности - ссылка указывает на мой блог)

+2

Visual Studio 2012 с .NET Framework 4.5 У все еще есть ошибка – Lu55

+0

У Visual Studio 2015 все еще есть ошибка :-(Еще три часа моей жизни ушли туда. –

17

Самое простое решение является определение х: Имя:

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

Дополнительная информация: http://connect.microsoft.com/VisualStudio/feedback/details/472729/wpf-cannot-find-resource-defined-in-the-app-xaml-file

+0

ссылка не работает .Не удается найти проблему с помощью поиска. – Lu55

+0

Добавлен новый https://connect.microsoft.com/VisualStudio/feedback/details/772087/ – Lu55

+0

Это решение сработало для меня, и оно является самым простым. – bignermo

1

Чтобы обойти эту ошибку, вы можете просто добавить ресурсы программно.

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

Этот код может быть размещен внутри конструктора для класса App.

 Смежные вопросы

  • Нет связанных вопросов^_^