WPF:Window.Show() - 不起作用

时间:2017-09-03 09:51:57

标签: c# wpf events

我有一个应用程序,在第一次运行时将要求用户选择配置,并打开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也是如此):

enter image description here

感谢任何帮助。

更新

在代码中添加Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;似乎解决了这个问题,虽然我不明白为什么App.xaml中的XAML版本不够......(如上所述,我确实有ShutdownMode="OnExplicitShutdown"在App.xaml)如果有人可以澄清我是否做错了什么,或者它是否是一个微软的错误???

0 个答案:

没有答案