4

複数の WPF ウィンドウを使用している WPF プロジェクトがあります。私のWPFウィンドウは次のとおりです。

  • メインウィンドウ
  • ウィンドウ1
  • ログイン

最初のシナリオではすべて正常に動作しますが、2 番目のシナリオでは null 参照例外が発生します。

  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.2 番目のシナリオ: App.xaml は、スタートアップ ウィンドウがログイン ウィンドウになるように構成されます。ログインのコード:

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

このシナリオでは、Window1 のボタンをクリックすると、obj に対して null 参照例外がスローされます。

MainWindow2番目のケースで例外を引き起こすこれら2つのケースの初期化の違いは何ですか?どうすればそれを克服できますか?

4

2 に答える 2

5

さて、Windowアプリケーションを起動したときに最初に開かれるのは、 を呼び出したときに返されるウィンドウになりますApplication.Current.MainWindow

あなたの場合、それは ですLoginが、Window1あなたはそれが であると期待していますがMainWindow、これは間違っています。Loginが閉じられているため、null が返され、アプリがクラッシュします。

これを修正するにはMainWindow、MainWindow を作成する必要があります :-)

Login次のようにしてそれを行うことができます:

var window = new MainWindow();
Application.Current.MainWindow = window;
window.Show();
this.Close();
于 2013-03-26T16:09:46.867 に答える
0

シナリオ 2のthis.Close()ログイン ウィンドウで を実行すると、アプリケーションが閉じます。これは、app.xaml ファイルでスタートアップ ウィンドウとして指定されているウィンドウだからです。MainWindow プロパティを参照してください

MainWindow は、AppDomain でインスタンス化される最初の Window オブジェクトへの参照を使用して自動的に設定されます。

最初のシナリオでは、MainWindow を閉じないので、アプリケーションは続行します。2 番目の例では、ログイン ウィンドウを閉じて、アプリケーションを終了します。

最初のシナリオでは、ユーザーが window1 に転送される場所を示していません。そのコードも表示されると役立ちます。

于 2013-03-22T19:09:36.717 に答える