我正在设置一个简单的WPF应用程序,该应用程序查看其命令行参数以确定接下来应显示哪种窗口。确定之后,我会通过调用new ApplicationWindow()
来显示下一个窗口,设置内容,然后致电Show()
。问题是MainWindow
实例似乎有#34;应用程序控制" - 即当它关闭时,其他一切都会关闭。
它是这样的:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
TopBar.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF1975DD"));
this.ContentRendered += MainWindow_ContentRendered;
this.OperationModeSet += MainWindow_OperationModeSet;
}
[STAThread]
private void MainWindow_ContentRendered(object sender, EventArgs e)
{
Thread worker = new Thread(new ThreadStart(this.ParseCommandLineArgs));
worker.SetApartmentState(ApartmentState.STA);
worker.Start();
}
[STAThread]
public void ParseCommandLineArgs()
{
Thread.Sleep(3000);
string[] args = Environment.GetCommandLineArgs();
if (args.Any(item => item == "--server" || item == "-s"))
{
SetOperationMode(OperationMode.Server);
Dispatcher.BeginInvoke(new Action(delegate()
{
this.CloseWindow();
}));
}
else
{
SetOperationMode(OperationMode.Client);
Dispatcher.BeginInvoke(new Action(delegate()
{
this.CloseWindow();
}));
}
}
[STAThread]
private void SetOperationMode(OperationMode mode)
{
OperatingMode = mode;
if (OperationModeSet != null)
{
OperationModeSet(this, new OperationModeSetEventArgs(mode));
}
}
[STAThread]
private void MainWindow_OperationModeSet(object sender, OperationModeSetEventArgs e)
{
AppWindow window = new AppWindow();
if (e.Mode == OperationMode.Client)
{
this.CloseWindow();
window.Content = new ClientPage();
}
else if (e.Mode == OperationMode.Server)
{
this.CloseWindow();
window.Content = new ServerPage();
}
window.Show();
}
}
这些方法按照我通过各种事件将它们放在这里的顺序进行调用。我省略了一些字段和属性。
问题是当this MainWindow
关闭时,window
也会关闭 - 实例化的ApplicationWindow
。我认为这是因为MainWindow
创建了它。
但是,我确实希望能够关闭MainWindow
并继续使用另一个窗口作为" main"窗口 - 那么如何将实例化的ApplicationWindow
与其父MainWindow
分离,以便继续?
我已经看到在App.xaml中设置Application.MainWindow会更改主窗口 - 但是我没有引用可以放入静态XAML文件的实例化窗口。
答案 0 :(得分:2)
为什么要解析MainWindow中的命令行参数?
您可以删除App.xaml中的StartupUri并覆盖OnStartup方法。然后,您可以使用StartUpArgs来决定您想要的操作模式。
在App.xaml.cs
中protected override void OnStartup(StartupEventArgs e)
{
// Decide which window to show here
// Add bounds checks etc.
if (e.Args[0] == "-s")
{
var window = new ServerPage();
window.Show();
}
else
{
var window = new ClientPage();
window.Show();
}
Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
base.OnStartup(e);
}
答案 1 :(得分:1)
我认为你能做什么(现在有更好的选择我敢肯定......)而不是在你的主程序中创建一个新窗口,将你的其他代码移动到一个新项目和你的主项目中,启动它是Process.Start(...)
的新流程。
我只看过使用过它的代码,但我自己从未写过。但我会看看this page from the MDSN和与之相关的网页
请原谅缺乏帮助您的示例代码,这只是我所知的边缘,我不想给你错误的代码。