我的mainWindow需要订阅一个对象的一些事件。在创建MainWindow之前初始化对象。我想通过它的构造函数将这个对象传递给mainWindow。
但是我无法弄清楚MainWindow构造函数的调用位置。或者,我尝试通过MainWindow的成员函数传递对象,但在调用app.MainWindow
之前null
为app.Run()
。调用app.Run()
后,代码在程序终止之前不会返回。
另一个可能性是将对象存储在静态类中并使MainWindow访问,但这似乎不必要地复杂。
我意识到我可以在MainWindow构造函数中创建对象,但这意味着必须在那里放置很多其他代码,几乎就是整个Main函数。
如何将此对象传递给我的MainWindow?或者MainWindow构造函数是否用作整个程序的“Main”?
答案 0 :(得分:24)
你可以这样做。
首先进入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我的constructors,但这当然不是一种要求。
答案 1 :(得分:2)
您可以通过在XAML本身中声明它来将对象设置为MainWindow的DataContext。 (例如,如果您尝试创建ViewModel)。除此之外,WPF将以您无法控制的方式创建实例。您可以将自己的代码放在App类中以创建和显示窗口,并从App.xaml中删除StartupUri。