1

我正在设置一个简单的 WPF 应用程序,它查看它的命令行参数以确定接下来应该显示哪种类型的窗口。确定后,我通过调用new ApplicationWindow()、设置内容和调用来显示下一个窗口Show()。问题是该MainWindow实例似乎具有“应用程序控制” - 即当它关闭时,其他一切也是如此。

它是这样的:

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并继续将另一个窗口作为“主”窗口 - 那么如何将实例化ApplicationWindow与其父窗口分离MainWindow以使其继续?

我已经看到在 App.xaml 中设置 Application.MainWindow 会更改主窗口 - 但我没有引用可以放入静态 XAML 文件的实例化窗口。

4

2 回答 2

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);
}
于 2015-06-05T14:10:40.077 回答
1

我认为你可以做的(现在我确定有更好的选择......)不是在你的主程序中创建一个新窗口,而是将你的其他代码移动到一个新项目中,然后在你的主项目中,将其作为的新工艺Process.Start(...)。我只见过使用它的代码,我自己从来没有从头开始编写过。但我会从 MDSN和与之相关的页面看一下这个页面。
请原谅缺少示例代码来帮助你,这只是我知识的边缘,我不想给你不正确的代码。

于 2015-06-05T14:09:24.260 回答