我有一个应用程序,在第一次运行时将要求用户选择配置,并打开FirstRunWindow。之后,它启动MainWindow。
到目前为止,我已将它与事件联系在一起,并且完美无缺。但我开始认为实际上我不需要一个事件,我试图重新编写代码,但是我得到了奇怪的结果。
1)如果检查不需要运行第一个窗口,它将正确加载主窗口。但是如果第一个窗口运行 - MainWindow.Show()将不起作用(即主窗口不会出现)。我调试了调试器 - 没有抛出任何错误,似乎已经执行得很好,但是没有出现。
2)将Show更改为ShowDialog()无法解决问题,并且在调用Application.Current.Shutdown()时也会抛出错误。
3)如果第一个窗口没有出现,在MainWindow.Show()工作之后放置一个MessageBox.Show(),如果出现第一个窗口,则会抛出奇怪的错误(非常长的堆栈,最后一个异常是“ uri前缀未被识别“ - 但这看起来完全不相关,而且都是因为MessageBox ???
我还应该注意 ShutdownMode =“OnExplicitShutdown”。因此,不用担心窗户是否打开。
以下是代码在之前的,以及事件(再次,这有效):
public static event EventHandler ContinueMain;
public void StartFlow()
{
// Check if this is the first run
CheckFirstRun();
// Hook up an event
FirstRun.ContinueMain += FirstRun_ContinueMain;
}
private void FirstRun_ContinueMain(object sender, EventArgs e)
{
ContinueMain();
}
public void ContinueMain()
{
// Do Stuff
DoStuff();
// Show's Main Window
ShowMain();
}
public void CheckFirstRun()
{
if (condition)
{
firstRunWindow = new FirstRunWindow();
firstRunWindow.Show();
return;
}
ContinueMain();
}
// Called when user clicks on Finish in last view in FirstRunWindow...
public void FirstRunFinish()
{
firstRunWindow.Close();
ContinueMain?.Invoke(null, EventArgs.Empty)
}
public void DoStuff()
{
//irrelevant
}
public void ShowMain()
{
var mainWindow = new MainWindow();
mainWindow.Show();
}
以下是代码现在的样子,没有事件但有错误:
public void StartFlow()
{
// Check if this is the first run
CheckFirstRun();
// Do Stuff
DoStuff();
// Show's Main Window
ShowMain();
}
public void CheckFirstRun()
{
if (condition)
{
firstRunWindow = new FirstRunWindow();
firstRunWindow.ShowDialog(); // changed to ShowDialog, so that thread stops here and waits for the first window to close...
}
}
public void FirstRunFinish()
{
firstRunWindow.Close();
}
public void DoStuff()
{
//irrelevant
}
public void ShowMain()
{
var mainWindow = new MainWindow();
mainWindow.Show();
// MessageBox.Show("dbg: After mainWindow.Show()");
}
WER / EventViewer显示以下错误:
Exception Info: System.InvalidOperationException
at System.Windows.Application.set_ShutdownMode(System.Windows.ShutdownMode)
Exception Info: System.Windows.Markup.XamlParseException
at System.Windows.Markup.XamlReader.RewrapException(System.Exception, System.Xaml.IXamlLineInfo, System.Uri)
at System.Windows.Markup.WpfXamlLoader.Load(System.Xaml.XamlReader, System.Xaml.IXamlObjectWriterFactory, Boolean, System.Object, System.Xaml.XamlObjectWriterSettings, System.Uri)
at System.Windows.Markup.WpfXamlLoader.LoadBaml(System.Xaml.XamlReader, Boolean, System.Object, System.Xaml.Permissions.XamlAccessLevel, System.Uri)
at System.Windows.Markup.XamlReader.LoadBaml(System.IO.Stream, System.Windows.Markup.ParserContext, System.Object, Boolean)
at JITBClient.App.Main()
这里是MessageBox异常(对于Forms.MessageBox和wpf MessageBox也是如此):
感谢任何帮助。
更新
在代码中添加Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
似乎解决了这个问题,虽然我不明白为什么App.xaml中的XAML版本不够......(如上所述,我确实有ShutdownMode="OnExplicitShutdown"
在App.xaml)如果有人可以澄清我是否做错了什么,或者它是否是一个微软的错误???