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 MainWindowwindowインスタンス化され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 に答える