2012-04-15 33 views
15

我的主窗口需要訂閱一個對象的一些事件。該對象在創建MainWindow之前被初始化。我想通過它的構造函數將這個對象傳遞給mainWindow。如何編輯WPF應用程序的MainWindow構造函數?

但是我不知道從哪裏調用MainWindow構造函數。或者我嘗試通過MainWindow的成員函數傳遞對象,但在調用app.Run()之前app.MainWindownull。在調用app.Run()之後,代碼將不會返回,直到程序終止。

另一個可能性是將對象存儲在一個靜態類中,並具有MainWindow訪問權限,但這看起來不必要的複雜。

我意識到我可以在MainWindow構造函數中創建對象,但這意味着必須在其中放置很多其他代碼,幾乎是整個Main函數。

如何將此對象傳遞給我的MainWindow?或者是MainWindow的構造函數是用作整個程序的'Main'的?

回答

23

你可以這樣做。

首先進入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() 
{ 

} 

我喜歡我的chainconstructors,但它當然以任何方式不作要求。

+0

謝謝,這個作品很有魅力。儘管如此,這意味着'OnStartup'函數幾乎就是'Main',除非您繼承'StartupEventArgs'並將您需要的所有東西放在'Main'中。我想這實際上並不重要,我只是習慣於C++。 – 2012-04-15 22:32:43

2

您可以通過在XAML自身中聲明它來將該對象設置爲MainWindow的DataContext。 (例如,如果您嘗試創建ViewModel)。除此之外,WPF將以您無法控制的方式創建實例。您可以將自己的代碼放入App類中以創建並顯示窗口,並從App.xaml中刪除StartupUri。

+0

使用'DataContext'是WPF中的一種方式,特別是如果您想在稍後使用更高級的模式,例如'MVVM'時。 – eandersson 2012-04-15 22:18:28

+0

感謝您的回答,我會接受富士的答案,因爲它更廣泛一些。 – 2012-04-15 22:35:45

相關問題