Как отредактировать конструктор MainWindow приложения WPF?

My mainWindow должен подписаться на некоторые события из объекта. Объект инициализируется до создания MainWindow. Я хотел бы передать этот объект в mainWindow через его конструктор.

Однако я не могу понять, откуда вызывается конструктор MainWindow. В качестве альтернативы я попытался передать объект через функцию-член MainWindow, но app.MainWindow - null до вызова app.Run(). После вызова app.Run() код не возвращается, пока программа не завершится.

Другая возможность - хранить объект в статическом классе и иметь доступ к MainWindow, но это кажется излишне сложным.

Я понимаю, что могу просто создать объект в конструкторе MainWindow, но это означало бы, что нужно было бы добавить в него много другого кода, в значительной степени всю главную функцию.

Как передать этот объект в свой MainWindow? Или конструктор MainWindow, предназначенный для работы в качестве "Основной" для всей программы?

Ответы

Ответ 1

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

Сначала перейдите в App.xaml и удалите эту строку StartupUri="MainWindow.xaml", чтобы WPF не показывал автоматически MainWindow.

Затем щелкните правой кнопкой мыши по App.xaml и выберите View Code, чтобы открыть App.xaml.cs. Внутри этого файла нам нужно переопределить событие OnStartup.

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

}

Я предпочитаю chain мои конструкторы , но это, конечно, не является обязательным условием.

Ответ 2

Вы можете установить объект как DataContext MainWindow, объявив его в самом XAML. (Если вы пытаетесь создать ViewModel, например). Помимо этого, WPF создаст экземпляр таким образом, который вы не сможете контролировать. Вы можете поместить свой собственный код в класс App для создания и отображения окна и удалить StartupUri из App.xaml.