2015-09-22 48 views
1

我正在嘗試爲我的WPF應用程序編寫自定義Main()函數,以便我可以解析命令行並根據命令行配置GUI。我無法弄清楚如何獲取由Main()的默認實現創建的MainWindow實例。在App.g.cs發現自動生成的實現如下:在WPF中獲取對自定義main()中的MainWindow的引用

public void InitializeComponent() { 
    if (_contentLoaded) { 
     return; 
    } 
    _contentLoaded = true; 

    #line 5 "..\..\..\App.xaml" 
    this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative); 

    #line default 
    #line hidden 
    System.Uri resourceLocater = new System.Uri("/MyApplication;component/app.xaml", System.UriKind.Relative); 

    #line 1 "..\..\..\App.xaml" 
    System.Windows.Application.LoadComponent(this, resourceLocater); 

    #line default 
    #line hidden 
} 

[System.STAThreadAttribute()] 
public static void Main() { 
    MyApplication.App app = new MyApplication.App(); 
    app.InitializeComponent(); 
    app.Run(); 
} 

我遇到正在試圖獲得一個參考我的MainWindow類被實例化後的問題(當然,這是實際上是通過StartupUri完成)。我希望能夠做一些事情,如:

[System.STAThreadAttribute()] 
public static void Main() { 
    MyApplication.App app = new MyApplication.App(); 
    app.InitializeComponent(); 
    MyApplication.MainWindow w = (MyApplication.MainWindow)app.MainWindow; 
    w.MyProgramIsAwesomeProperty = true; 
    app.Run(); 
} 

但是,該app.MainWindow總是null。我也試過在Console.WriteLine線以下,並設置斷點,但該計劃從未達到的回調:

[System.STAThreadAttribute()] 
public static void Main() { 
    MyApplication.App app = new MyApplication.App(); 
    app.LoadCompleted += app_LoadCompleted; 
    app.Activated += app_Activated; 
    app.InitializeComponent(); 
    app.Run(); 
} 

static void app_Activated(object sender, EventArgs e) 
{ 
    Console.WriteLine("Activated"); 
} 

static void app_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e) 
{ 
    Console.WriteLine("LoadCompleted"); 
} 

所以,我怎樣才能到MyApplication.MainWindow參考之後,它已經在我的Main函數實例化?

+0

嘗試Application.Current.MainWindow – Tuco

+0

也是'null'。 :-( –

+0

我認爲這是因爲你需要創建一個MainWindow的實例,然後將它分配給Application.Current.MainWindow – Tuco

回答

1

如果要從命令行向GUI發送某些內容,最好在Application類中調用一個方法,然後從中打開GUI。

打開App.xaml文件,請從Application元素StartupUri屬性,並添加一個Startup屬性:

Startup="Application_Startup" 

然後創建一個在您Application類的Application_Startup方法讀取命令行或任何與將發送到您的GUI:

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    // e.Args contains command-line arguments. 
    MainWindow mw = new MainWindow(Whatever(e.Args)); 
    mw.Show(); 
} 
+0

是否有理由使用此重寫'OnStartup(StartupEventArgs e)'? – clcto

+0

那麼,這是答案基本上做'StartupUri'的東西呢? –

+0

@clcto我記得很久以前沒有調用OnStartup的情況,但不記得原因是什麼,是的,這基本上做了'StartupUri'的操作,但是在創建主窗口之前執行它,因此您可以在更改GUI之前做甚至決定不顯示GUI, –

2

其實,StartupUri設置不實例主窗口,並沒有設置相應Application.MainWindow財產。這種情況發生在Run方法的調用後,這就是爲什麼你會得到null

正確的方法是避免StartupUri並覆蓋OnStartup方法(雖然您可以添加事件處理程序,正如所建議的,但它在派生類中沒有多大意義)。然後,在OnStartup中,您可以直接實例化主窗口並設置要設置的屬性。

相關問題