How do I edit the MainWindow constructor of a WPF

2020-02-10 12:52发布

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?

标签: c# wpf
2条回答
▲ chillily
2楼-- · 2020-02-10 13:14

You could set the object as the DataContext of the MainWindow by declaring it in the XAML itself. (If you are trying to create a ViewModel, for instance). Other than that, WPF will create the instance in a way you can't control. You could put your own code in the App class to create and display the window, and remove the StartupUri from App.xaml.

查看更多
爷、活的狠高调
3楼-- · 2020-02-10 13:16

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.

查看更多
登录 后发表回答