Как отредактировать конструктор 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.