2015-06-05 4 views
1

Я настраиваю простое приложение 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.

ответ

2

Почему вы разбираете командные строки args в своем MainWindow?

Вы можете просто удалить StartupUri в App.xaml и переопределить метод 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); 
} 
+0

Не знал, что это было возможно. Благодаря! – ArtOfCode

+0

Хорошо, что это не совсем работает: после вызова 'window.Show()' окно просто исчезает снова. – ArtOfCode

+0

Мое первоначальное подозрение - это то, что не связано с кодом, который я опубликовал. Как ServerPage, так и ClientPage определены как Windows или Pages? При необходимости измените. Я не могу представить, почему это не сработает, как я описал. – bic

1

Что я думаю, что вы могли бы сделать (теперь есть лучшие варианты, я уверен ...) вместо того, чтобы создавать новое окно в вашей основной программе, переместите свой другой код в новый проект и в ваш основной проект, запустите его как новый процесс с Process.Start(...). Я когда-либо видел код, который использовал это, хотя и никогда не писал его с нуля. Но я бы посмотрел на this page from the MDSN и связанные с ним страницы.
Извините недостаток кода примера, который вам поможет, это только на краю моих знаний, и я бы не хотел давать вам неправильный код.