嘿...
我的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 ...愚蠢的错误...
答案 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,他让我沉迷于回答这个问题:)