2013-03-22 78 views
4

我有一个WPF项目,我使用了多个WPF窗口。 我的WPF Windows是:带空引用异常的WPF项目

  • 主窗口
  • 窗口1
  • 登录

我不得不案例场景中,第一个一切工作正常,但在第二次我得到一个空引用异常。

  1. 第一种方案: App.xaml中被配置成启动窗口是MainWindow

当用户点击按钮,主窗口他窗口1被转发了,我有以下代码:

MainWindow obj=(MainWindow)Application.Current.MainWindow; 
private void button1_Click(object sender, RoutedEventArgs e) 
     { 
     obj.checkBox1.IsChecked = false; 
     } 

2.Second方案: 的App.xaml配置以便登录启动窗口窗口。 代码在登录:

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

在这种情况下,当我在窗口1单击按钮,一个空引用异常被抛出OBJ。

这两种情况下MainWindow的初始化有什么不同,导致第二种情况下的异常,我该如何克服它?

回答

5

那么,第一个Window在您启动应用程序时打开,将成为您拨打Application.Current.MainWindow时返回的窗口。

在你的情况,这是Login,但在Window1你期望它是MainWindow,这是错误的。由于Login已关闭,因此返回null,应用程序崩溃。

为了解决这个问题,你必须做出MainWindow的主窗口:-)

你可以做,在Login像这样:

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

我认为这样可以解决我的问题。等到明天的时候我会回去工作测试它,并且只要问题解决了,我会接受您的答案...谢谢您的回复 – apomene 2013-03-26 16:26:35

+0

它的工作原理...谢谢 – apomene 2013-03-27 11:14:33

0

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

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

在第一种情况下,您不关闭MainWindow,以便应用程序继续。在第二个关闭登录窗口,以便应用程序退出。

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

+0

this.Close()关闭登录窗口 – apomene 2013-03-22 19:25:54

+0

我已经有在显示第二个窗口之前关闭第一个窗口的问题,导致应用程序关闭。两个选项可以避免我使用过的这种行为。 1)将Application.ShutdownMode属性更改为OnExplicitShutdown。 2)在调用第一个窗口上的Close()的新窗口上调用Show()之后,使用Dispatcher.BeginInvoke()在低优先级上排队一个委托。 – Steve 2013-03-22 20:53:22