Я настраиваю простое приложение WPF, которое рассматривает аргументы командной строки, чтобы определить, какое окно должно быть показано далее. Когда это будет определено, я покажу следующее окно, позвонив new ApplicationWindow()
, настройте содержимое и позвоните Show()
. Проблема в том, что экземпляр MainWindow
, похоже, имеет «управление приложениями», то есть когда он закрывается, также делает все остальное.Как передать управление приложениями в другое окно WPF?
Это выглядит следующим образом:
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
так продолжается?
Я видел, что приложение Application.MainWindow в App.xaml меняет основное окно, но я не имею ссылки на экземплярное окно, которое можно поместить в статический файл XAML.
Не знал, что это было возможно. Благодаря! – ArtOfCode
Хорошо, что это не совсем работает: после вызова 'window.Show()' окно просто исчезает снова. – ArtOfCode
Мое первоначальное подозрение - это то, что не связано с кодом, который я опубликовал. Как ServerPage, так и ClientPage определены как Windows или Pages? При необходимости измените. Я не могу представить, почему это не сработает, как я описал. – bic