我正在尝试为我的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)
的引用?
答案 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();
}