16

私の mainWindow は、オブジェクトからいくつかのイベントを購読する必要があります。オブジェクトは、MainWindow が作成される前に初期化されます。このオブジェクトをコンストラクターを介して mainWindow に渡したいと思います。

ただし、 MainWindow コンストラクターが呼び出された場所がわかりません。または、MainWindow のメンバー関数を介してオブジェクトを渡そうとしましたが、app.MainWindow以前nullapp.Run()呼び出されました。が呼び出された後app.Run()、プログラムが終了するまでコードは戻りません。

別の可能性は、オブジェクトを静的クラスに格納し、MainWindow にアクセスさせることですが、これは不必要に複雑に思えます。

MainWindow コンストラクターでオブジェクトを作成するだけでよいことに気付きましたが、それは、MainWindow コンストラクターに他の多くのコード、つまり Main 関数のほぼ全体を配置する必要があることを意味します。

このオブジェクトを MainWindow に渡すにはどうすればよいですか? または、MainWindow コンストラクターは、プログラム全体の「メイン」として機能することを意図していますか?

4

2 に答える 2

27

あなたはこのようにそれを行うことができます。

まずApp.xaml、この行に移動して削除StartupUri="MainWindow.xaml"し、WPFが自動的にを表示しないようにしますMainWindow

次に右クリックして、開くことApp.xamlを選択します。このファイル内で、イベントをオーバーライドする必要があります。View CodeApp.xaml.csOnStartup

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
}

内部OnStartupでは、インスタンス化してMainWindow表示できます。

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    MainWindow mw = new MainWindow();
    mw.Show();
}

Constructorそして今、これを使用して、より多くの情報を渡すために使用できる代替をロードできます。

App.xaml.cs

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    MainWindow mw = new MainWindow(5);
    mw.Show();
}

MainWindow.xaml.cs

public MainWindow()
{
    InitializeComponent();
}

public MainWindow(int number) : base()
{

}

私はコンストラクターをチェーンすることを好みますが、もちろんそれは決して要件ではありません。

于 2012-04-15T22:10:31.940 に答える
2

XAML 自体で宣言することにより、オブジェクトを MainWindow の DataContext として設定できます。(たとえば、ViewModel を作成しようとしている場合)。それ以外では、WPF は制御できない方法でインスタンスを作成します。App クラスに独自のコードを配置して、ウィンドウを作成および表示し、App.xaml から StartupUri を削除することができます。

于 2012-04-15T22:04:06.213 に答える