C# 获取对WPF中自定义main()中MainWindow的引用
我正在尝试为我的WPF应用程序编写一个自定义的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.
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。我刚刚尝试在启动时覆盖,效果很好,但我将把这个答案作为替代方法。