私は単純な 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 ファイルに入れることができるインスタンス化されたウィンドウへの参照がありません。