How do I edit the MainWindow constructor of a WPF application?

c#, wpf

Solution

You could do it like this.

First go into `App.xaml` and remove this line `StartupUri="MainWindow.xaml"` to prevent WPF from automatically showing the `MainWindow`.

Next right click on `App.xaml` and choose `View Code` to open up `App.xaml.cs`. Inside this file we need to to override the `OnStartup` event.

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

Inside `OnStartup` we can then instantiate our `MainWindow` and show it.

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

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

And now we can use this to load an alternative `Constructor` that we can use to pass on more information.

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()
{

}

I prefer to chain my constructors, but it's of course not a requirement by any means.

Problem

My mainWindow needs to subscribe to some events from an object. The object is initialized before the MainWindow is created. I would like to pass this object to the mainWindow via its constructor. However I can't figure out from where the MainWindow constructor is called. Alternatively I tried to pass the object via a member function of the MainWindow, but the `app.MainWindow` is `null` before `app.Run()` is called. After `app.Run()` is called the code doesn't return until the program terminates. Another posibility would be storing the object in a static class and have the MainWindow access that, but this seems unnecessarily complicated. I realize I can just create the object in the MainWindow constructor, but that would mean having to put a lot of other code there as well, pretty much the entire Main function. How can I pass this object to my MainWindow? Or is the MainWindow constructor intended to function as the 'Main' for the entire program?

Original source