WPF项目出现空引用异常

4
我有一个WPF项目,其中我使用了多个WPF窗口。 我的WPF窗口如下:
- 主窗口(MainWindow) - 窗口1(Window1) - 登录(Login)
我有两种情况,第一种情况一切正常,但在第二种情况下,我会收到空引用异常。
第一种情况: App.xaml被配置为启动窗口MainWindow
当用户在MainWindow上单击按钮时,他将被转发到Window1,其中我有以下代码:
MainWindow obj=(MainWindow)Application.Current.MainWindow;
 private void button1_Click(object sender, RoutedEventArgs e)
        {
        obj.checkBox1.IsChecked = false;
        }

第二种情况:

配置App.xaml以便启动窗口为登录窗口。

登录页面的代码:

private void button1_Click(object sender, RoutedEventArgs e)
        {
        var window=new MainWindow();
        window.Show();
        this.Close();
        }

在这种情况下,当我在Window1中点击按钮时,obj引用将抛出空引用异常。

在这两种情况下,MainWindow的初始化有何差异导致第二种情况出现异常,如何克服它?

2个回答

5

首先打开应用程序时,第一个被打开的Window将成为您调用Application.Current.MainWindow时获得的窗口。

在您的情况下,那是Login,但在Window1中,您期望它是MainWindow,这是错误的。由于Login已经关闭,您会得到null返回值,并且应用程序崩溃。

要解决此问题,您需要使MainWindow成为主窗口 :-)

您可以在Login中这样做:

var window = new MainWindow();
Application.Current.MainWindow = window;
window.Show();
this.Close();

我认为这解决了我的问题。等到明天回到工作岗位测试一下,如果问题得到解决,我会接受你的答案...谢谢回复。 - apomene

0

在方案2中,您登录窗口上的this.Close()将关闭应用程序,因为这是在app.xaml文件中指向的窗口作为启动窗口。请参见MainWindow property

MainWindow会自动设置一个引用,指向在AppDomain中实例化的第一个Window对象。

在第一种情况下,您没有关闭MainWindow,因此应用程序继续运行。在第二种情况下,您关闭了登录窗口,因此应用程序退出。

在第一种情况下,您没有显示用户转发到window1的位置。看到那段代码也会很有帮助。


this.Close() 关闭登录窗口。 - apomene
我曾经遇到过这样的问题,在显示第二个窗口之前关闭了第一个窗口,导致应用程序关闭。有两种避免这种行为的选项。1)更改Application.ShutdownMode属性为OnExplicitShutdown。2)使用Dispatcher.BeginInvoke()在您调用新窗口上的Show()后在非常低的优先级上排队委托,该委托在第一个窗口上调用Close()。 - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接