2016-04-20 2 views
0

Я создаю главное окно внутри App.xaml.cs конструктора, как это:Не можете найти локатор ресурсов при создании окна в App.xaml

MainWindow wnd = new MainWindow(); 

Application.Current.MainWindow = wnd; 
wnd.Show(); 

Запуск приложения дает мне XamlParseException, ресурс с именем " Locator "не найден.

Это подозрительная линия:

<DockPanel x:Name="MainPanel" DataContext="{Binding MainWindowViewModel, Source={StaticResource Locator}}" LastChildFill="True"> 

Использование StartupUri в App.xaml работает просто отлично.

Что я делаю неправильно ?!

ответ

1

Предполагаю, что у вас есть свой ресурс Locator в App.xaml. Причина, по которой он не работает, когда вы помещаете свой код в конструктор, заключается в том, что App.xaml еще не загружен. Если вы видите метод Main по умолчанию, созданный визуальной студией, вы увидите, что после конструктора вызывается App.InitializeComponent. Ресурсы в файле xaml инициализируются в этот момент.

Вы можете исправить проблему, поставив свой код в событие Application.Startup, которое возникает при вызове метода «Выполнить» объекта «Приложение». (Если StartupUri установлен, он также инициализируется после Run называется.)

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

Конечно, вы можете подписаться на это событие и писать код в левши событий. Однако, когда мы хотим подписаться на события в базовом классе, лучше переопределить метод OnXXX для соответствующего события.

Вкл. И кстати, эта линия не нужна Application.Current.MainWindow = wnd;. Это будет сделано автоматически для вас по wpf.

+0

Большое спасибо, работает как шарм. Что делать, если я вообще не хочу, чтобы графический интерфейс отображался? Создание окна не очень помогает, так как приложение все еще работает без окна. Я хочу реализовать параметр/noGui, если он установлен, ни одно окно не будет создано, а некоторые задачи будут выполнены. Вызов Application.Current.Shutdown() кажется неправильным для меня. – DoubleVoid

+0

В этом случае вам необходимо изменить App.g.cs. Там вы найдете метод Main. Вы можете добавить свою логику здесь. Если параметр установлен, не запускайте приложение. Иначе делай. –

+0

Application.Current.Shutdown() не будет работать, потому что он возвращает App.Run(), что означает, что программа закончится, если у вас нет пользовательской логики, установленной в Main –

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