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

时间:2015-09-22 19:13:44

标签: c# wpf main

我正在尝试为我的WPF应用程序编写自定义Main()函数,以便我可以解析命令行并根据命令行配置GUI。我无法弄清楚如何获得对MainWindow默认实现创建的Main()实例的引用。 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();
}

我遇到的问题是在实例化之后尝试获取对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之后获得gon.push(variable_name: 1) 的引用?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

如果要从命令行向GUI发送内容,最好在Application类中调用方法并从中打开GUI。

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

Startup="Application_Startup"

然后在Application_Startup类中创建一个Application方法,该方法读取命令行或其他任何内容并将其发送到GUI:

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