16

我的 mainWindow 需要从一个对象订阅一些事件。在创建 MainWindow 之前初始化该对象。我想通过它的构造函数将此对象传递给 mainWindow。

但是我不知道从哪里调用 MainWindow 构造函数。或者,我尝试通过 MainWindow 的成员函数传递对象,但是调用了app.MainWindowis nullbefore app.Run()。Afterapp.Run()被调用,代码在程序终止之前不会返回。

另一种可能性是将对象存储在静态类中并让 MainWindow 访问它,但这似乎不必要地复杂。

我意识到我可以在 MainWindow 构造函数中创建对象,但这意味着必须在其中放置许多其他代码,几乎是整个 Main 函数。

如何将此对象传递给我的 MainWindow?还是 MainWindow 构造函数旨在充当整个程序的“主”?

4

2 回答 2

27

你可以这样做。

首先进入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现在我们可以使用它来加载我们可以用来传递更多信息的替代方案。

应用程序.xaml.cs

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

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

主窗口.xaml.cs

public MainWindow()
{
    InitializeComponent();
}

public MainWindow(int number) : base()
{

}

我更喜欢链接我的构造函数,但这当然不是任何要求。

于 2012-04-15T22:10:31.940 回答
2

您可以通过在 XAML 本身中声明对象来将对象设置为 MainWindow 的 DataContext。(例如,如果您尝试创建 ViewModel)。除此之外,WPF 将以您无法控制的方式创建实例。您可以将自己的代码放在 App 类中以创建和显示窗口,并从 App.xaml 中删除 StartupUri。

于 2012-04-15T22:04:06.213 回答