Окно не распознает ресурс приложения - PullRequest
2 голосов
/ 29 февраля 2012

Чтобы воспроизвести ошибку:

Создайте новое приложение MVVM-Light WPF.

Скопируйте MainWindow.xaml в MainWindow2.xaml Переименуйте имя класса MainWindow2 в MainWindow2 (и конструктор)

Переименуйте атрибут класса окна MainWindow2 в "x: Class =" MvvmLight2.MainWindow2 "

Удалите StartupUri из App.xaml

Добавьте в приложение следующее:

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

Запустите приложение и получите ошибку:

Cannot find resource named '{Locator}'. Resource names are case sensitive.  Error at object 'System.Windows.Data.Binding' in markup file 'MvvmLight2;component/mainwindow.xaml' Line 10 Position 9.

Чтобы устранить ошибку: удалите DataContext = "{Binding Main, Source = {StaticResource Locator}}" из обоих окон.

Добавьте следующую строку в конструкторы обоих окон:

DataContext = new ViewModelLocator().Main;

Приложение теперь запускается.

Вопрос в том, почему он не распознает локатор, даже если он определен как ресурс приложения?

Обновление:

Я только что заметил, что могу добавить один и тот же ресурс и в xaml, и в код без каких-либо видимых побочных эффектов. Теперь возникает вопрос, есть ли проблема?с этим?Создает ли он дублирующийся ресурс или нет, потому что у них одинаковый ключ?Больше, чем просто взлом, я пытаюсь понять, что происходит.

1 Ответ

2 голосов
/ 20 апреля 2017

Удалось исправить это, добавив InitializeComponent() в Application.Startup обработчик событий:

App.xaml

<Application x:Class="SomeNamespace.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Startup="Application_Startup"> <!-- Important to use Startup -->

App.xaml.cs

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        InitializeComponent(); // <-- Important to set this!

        var window = new MainWindow();

        window.Show();
    }
}
...