WPF-找不到在应用程序XAML文件中定义的资源

时间:2019-05-27 13:21:32

标签: c# wpf startup

嘿...

我的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帖子:https://stackoverflow.com/a/3896209/5663348
建议的解决方法是定义Application元素的x:Name。但是它如何帮助我访问定义的资源?不幸的是,“更多信息”的链接已损坏(太旧了)...
应用这个问题的公认答案甚至不能解决问题。

我正在使用.Net Framework 7.4.2

有人可以给我一些提示,我该如何解决?

干杯和谢谢:)

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

问题已解决... 真实的应用程序在实例化App类时初始化了MainWindow和SplashWindow ...愚蠢的错误...

1 个答案:

答案 0 :(得分:0)

问题
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的实例化导致了异常,导致它们试图访问App中定义的资源,但是实例化未完成,因此无法访问Object。
在尝试重建错误时,我创建了一个简单得多的App,其中MainWindow和SplashWindow在App.OnStartup(e)中实例化,但是当调用此Event时,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,他让我沉迷于回答这个问题:)