如何将应用程序控制传递到另一个WPF窗口?

时间:2015-06-05 13:54:10

标签: c# wpf mainwindow

我正在设置一个简单的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文件的实例化窗口。

2 个答案:

答案 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和与之相关的网页 请原谅缺乏帮助您的示例代码,这只是我所知的边缘,我不想给你错误的代码。