Проект WPF с исключением нулевой ссылки

У меня есть проект WPF, в котором я использую несколько окон WPF. Мои Windows WPF:

  • MainWindow
  • Окно1
  • Авторизоваться

У меня есть сценарии, в первом все работает нормально, но во втором я получаю исключение с нулевой ссылкой.

  1. Первый сценарий: App.xaml настроен так, чтобы окно запуска было MainWindow.

Когда пользователь нажимает кнопку в MainWindow, он перенаправляется в Window1, где у меня есть следующий код:

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

2. Второй сценарий: App.xaml настроен так, чтобы окно запуска было окном входа в систему. Код в логине:

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

В этом сценарии, когда я нажимаю кнопку в Window1, для obj выдается исключение с нулевой ссылкой.

В чем разница в инициализации MainWindow в этих двух случаях, которая вызывает исключение во втором случае, и как я могу ее преодолеть?


person apomene    schedule 22.03.2013    source источник


Ответы (2)


Итак, первое Window, открываемое при запуске приложения, станет окном, которое вы вернетесь при вызове Application.Current.MainWindow.

В вашем случае это Login, но в Window1 вы ожидаете, что это будет MainWindow, что неверно. Поскольку Login был закрыт, вы вернетесь к нулю, и приложение выйдет из строя.

Чтобы исправить это, вам нужно сделать MainWindow MainWindow :-)

Вы можете сделать это в Login вот так:

var window = new MainWindow();
Application.Current.MainWindow = window;
window.Show();
this.Close();
person Peter Hansen    schedule 26.03.2013
comment
Я думаю, что это решит мою проблему ... подождите до завтра, когда я вернусь к работе, чтобы проверить это, и я приму ваши ответы, поскольку проблема решена ... спасибо за ответ - person apomene; 26.03.2013

this.Close() в окне входа в систему в сценарии 2 закроет приложение, поскольку это окно указано в файле app.xaml как окно запуска. См. свойство MainWindow.

MainWindow автоматически устанавливается со ссылкой на первый объект Window, который будет создан в AppDomain.

В первом сценарии вы не закрываете MainWindow, поэтому приложение продолжает работу. Во втором вы закрываете окно входа в систему, и приложение закрывается.

В первом сценарии вы не показываете, куда пользователь перенаправляется в window1. Было бы полезно увидеть и этот код.

person Harrison    schedule 22.03.2013
comment
this.Close () закрывает окно входа в систему - person apomene; 22.03.2013
comment
У меня возникла проблема, когда я закрываю свое первое окно до того, как отображается второе, что приводит к завершению работы приложения. Два варианта, которые я использовал, чтобы избежать такого поведения. 1) Измените свойство Application.ShutdownMode на OnExplicitShutdown. 2) Используйте Dispatcher.BeginInvoke (), чтобы поставить делегата в очередь с очень низким приоритетом сразу после вызова Show () в новом окне, которое вызывает Close () в первом окне. - person Steve; 23.03.2013