WPF - не удается найти ресурс, определенный в файле приложения xaml - PullRequest
0 голосов
/ 27 мая 2019

Heyho ...

В моем приложении WPF настроен автозапуск, который показывает настраиваемый экран-заставку и выполняет некоторые подготовительные действия (например, анализ аргументов, подготовка файловой системы, ...).Для этого я переопределяю метод OnStartup.

App.xaml.cs

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
      base.OnStartup(e);

      var splash = new SplashWindow();
      splash.Show();

      // do some black magic

      splash.Close();
      var mw = new MainWindow();
      mw.Show();
    }
  }
}

App.xaml

<Application x:Class="Example.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp1"
             ShutdownMode="OnExplicitShutdown">
    <Application.Resources>
        <ResourceDictionary>
            <Color x:Key="Foo">#FFFFAA00</Color>
            <SolidColorBrush x:Key="Bar" Color="{StaticResource Foo}" />
        </ResourceDictionary>
    </Application.Resources>
</Application>

Но при обработке запуска таким способом я не могу получить доступресурсы, определенные в app.xaml, т. е. в MainWindow.xaml или Splash.xaml.

Некоторые другие уже сталкивались с такой же проблемой, например, https://stackoverflow.com/a/13425695

Следуя обходной ссылке, я перехожу к этомуstackoverflow post: https://stackoverflow.com/a/3896209/5663348
Предлагаемый обходной путь - определить x:Name элемента Application.Но как это помогает мне получить доступ к определенному ресурсу?К сожалению, ссылка для «дополнительной информации» не работает (слишком старая) ...
Применение принятого ответа на этот вопрос даже не решает проблему.

Я использую .Net Framework 7.4.2

Может кто-нибудь дать мне несколько советов, как мне это решить?

Приветствия и благодарности :)

=================

Проблема решена ... Реальное приложение инициализировало MainWindow и SplashWindow, а класс App был создан ... глупая ошибка ...

1 Ответ

0 голосов
/ 29 мая 2019

Проблема
SplashWindow и MainWindow пытались получить доступ к ресурсам, определенным в App.xaml. В App.xaml.cs была сделана некоторая подготовка и др. загрузка некоторых файлов. Но пока приложение было создано, оно уже пыталось создать экземпляр SplashWindow и MainWindow

public partial class App : Application
{
    private readonly SplashWindow splash;

    public App() {
        splash = new SplashWindow();  // this cannot work, if SplashWindow has a reference to a resource defined in App
        this.MainWindow = new MainWindow();  // this cannot work, if MainWindow has a reference to a resource defined in App
    }

    protected override void OnStartup(StartupEventArgs e) {
        base.OnStartup(e);

        var splash = new SplashWindow(); // yes, splash was instancied multiple times...
        splash.Show();

        // do some magic

        splash.Close();
        MainWindow.Show();
    }
}

Создание SplashScreen и MainWindow вызвало исключение, потому что они пытались получить доступ к ресурсам, которые определены в приложении, но приложение не было завершено, поэтому доступ к объекту невозможен.
При попытке восстановить ошибку я создал гораздо более простое приложение, в котором MainWindow и SplashWindow были созданы в App.OnStartup (e), но когда это событие вызывается, объект App существует, поэтому он может работать.

Решение
Удаление поля splash и не использовать конструктор для создания экземпляров SplashWindow и MainWindow

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e) {
        base.OnStartup(e);

        var splash = new SplashWindow(); // yes, splash was instancied multiple times...
        splash.Show();

        // do some magic

        this.MainWindow = new MainWindow();
        splash.Close();
        MainWindow.Show();
    }
}

Спасибо всем, кто помог мне обнаружить эту ошибку ...
И отдельное спасибо @Default, который напомнил мне ответить на этот вопрос:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...