c# - 如何将应用程序控制传递给另一个 WPF 窗口?

标签 c# wpf mainwindow

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

最佳答案

为什么要在主窗口中解析命令行参数?

您可以只删除 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);
}

关于c# - 如何将应用程序控制传递给另一个 WPF 窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30668342/

相关文章:

c#获取进程窗口标题

C#、异步套接字服务器/客户端、StackOverflowException

javascript - 尝试使用 Angular 从 REST 调用填充下拉列表

c# - TextBox 中的水印/提示/占位符文本?

c# - 如何在 XAML 模板中使用 WPF 自定义控件属性?

c# - WPF 和 C# : Accessing, 引用和设置值以控制来自其他类的属性

c# - 使用 LINQ to SQL 进行分页

c# - 为什么我的 ItemsControls 中的项目不水平布局?

c# - 编译错误 : 'The type or namespace name ' Runtime' does not exist in the namespace 'MyAppNamespace.System' (are you missing an assembly reference? )'

c++ - 如何在Qt主窗口中显示QWebEngineView?