C# 获取对WPF中自定义main()中MainWindow的引用

C# 获取对WPF中自定义main()中MainWindow的引用,c#,wpf,main,C#,Wpf,Main,我正在尝试为我的WPF应用程序编写一个自定义的Main()函数,以便能够解析命令行并基于命令行配置GUI。我不知道如何获取对Main()的默认实现创建的MainWindow实例的引用。App.g.cs中自动生成的实现如下: public void InitializeComponent() { if (_contentLoaded) { return; } _contentLoaded = true; #line 5 "..\..\..\App.

我正在尝试为我的WPF应用程序编写一个自定义的
Main()
函数,以便能够解析命令行并基于命令行配置GUI。我不知道如何获取对
Main()
的默认实现创建的
MainWindow
实例的引用。
App.g.cs
中自动生成的实现如下:

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();
}
我遇到的问题是,在实例化后,试图获取对我的
main窗口
类的引用(但这实际上是通过
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.main窗口
总是
null
。我还尝试了以下方法并在
控制台.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");
}

那么,在我的
Main
函数中实例化了
MyApplication.MainWindow
之后,如何获得对它的引用呢?

如果您想从命令行向GUI发送一些东西,最好在应用程序类中调用一个方法,然后从中打开GUI

打开App.xaml文件,从
Application
元素中删除
StartupUri
属性,并添加
Startup
属性:

Startup="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();
}

如果您想从命令行向GUI发送一些内容,最好在应用程序类中调用一个方法并从中打开GUI

打开App.xaml文件,从
Application
元素中删除
StartupUri
属性,并添加
Startup
属性:

Startup="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();
}

实际上,
StartupUri
的设置并没有实例化主窗口,也没有设置相应的
Application.MainWindow
属性。这在调用
Run
方法之后发生,这就是为什么会得到
null


正确的方法是避免
StartupUri
并重写该方法(虽然您可以按照建议添加事件处理程序,但它在派生类中没有多大意义)。然后,在
OnStartup
中,您可以直接实例化主窗口并设置要设置的属性。

实际上,
StartupUri
的设置不会实例化主窗口,也不会设置相应的
Application.MainWindow
属性。这在调用
Run
方法之后发生,这就是为什么会得到
null


正确的方法是避免
StartupUri
并重写该方法(虽然您可以按照建议添加事件处理程序,但它在派生类中没有多大意义)。然后,在启动时,您可以直接实例化主窗口并设置要设置的属性。

也可以尝试Application.Current.mainWindow,即
null
:-(我认为这是因为您需要创建一个MainWindow实例,然后将其分配给Application.Current.MainWindowTry Application.Current.MainWindow,也就是
null
。)-(我认为这是因为您需要创建一个MainWindow实例,然后将其分配给Application.Current.MainWindow是否有理由在启动(StartupEventArgs e)时使用此vs覆盖
OnStartup(StartupEventArgs e)
?那么,这个答案基本上和
StartupUri
一样吗?@clcto我记得很久以前有一种情况,没有调用
OnStartup
,但不记得原因是什么。是的,这基本上和
StartupUri
一样,但在创建主窗口之前就这样做了,所以你可以做更改之类的事情GUI,甚至决定在打开之前不显示GUI。我刚刚尝试在启动时覆盖
OnStartup
,效果很好,但我会将此答案作为替代方法。使用此选项与在启动时覆盖
OnStartup(StartupEventArgs e)相比有什么原因吗
?那么,这个答案基本上和
StartupUri
一样吗?@clcto我记得很久以前有一种情况,没有调用
OnStartup
,但不记得原因是什么。是的,这基本上和
StartupUri
一样,但在创建主窗口之前就这样做了,所以你可以做更改之类的事情GUI,甚至决定在打开之前不显示GUI。我刚刚尝试在启动时覆盖
,效果很好,但我将把这个答案作为替代方法。