2013-03-27 3 views
0

У меня есть довольно интенсивное приложение для потоковой обработки, которое отлично работает ... однако, когда нажата кнопка перезапуска ... она следует через код, предоставляет модели просмотра и закрывает главный экран ... таким образом возвращая диалоговое окно и возвращаясь к app.xaml.cs.Перезапуск WPF App change Владелец темы Mainwindow

Это, как я реализовал рестарт ...

base.OnStartup(e); 

     // Register required assemblies. 
     RegisterAssemblies(); 

     foreach (FolderType type in FolderType.GetValues()) 
     { 
      if (!Directory.Exists(type.Value)) 
      { 
       Directory.CreateDirectory(type.Value); 
      } 
     } 

     bool? restart = true; 
     ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown; 
     dynamic window; 
     MainWindowViewModel viewModel; 

     while (restart == true) 
     { 
      running = true; 
      string[] files = Directory.GetFiles(FolderType.LASTCONFIGURATION.Value); 
      lastConfiguration = string.Empty; 

      if (files.Length != 0) 
      { 
       lastConfiguration = files[0]; 
      } 

#if (!DEBUG) 
      if (SystemParameters.PrimaryScreenHeight == 1080) 
      { 
       window = new MainWindowHD(); 
      } 
      else 
      { 
       window = new MainWindow(); 
      } 

      Mouse.OverrideCursor = Cursors.None; 
#else 
      window = new MainWindow(); 
#endif 

      window.ShowInTaskbar = false; 
      viewModel = new MainWindowViewModel(lastConfiguration, "saved_settings.xml", FolderType.CASES + "\\" + "case_configuration.xml"); 

      Application.Current.Dispatcher.BeginInvoke(new Action(() => 
       { 
        window.DataContext = viewModel; 
       } 
      )); 

      restart = window.ShowDialog(); 
     } 

     if (systemShutdown) 
     { 
      Process.Start("shutdown", "/s /t 0"); 
     } 

     Shutdown(0); 

Это снова поворачивает петли и сбрасывает объект окна и объект ViewModel, но теперь Application.Current.MainWindow во всех моих других классов жалуются другой поток, владеющий им. Я думаю, что я получаю это, добавляя приложение (приложение) .Dispatcher.Invoke, однако я бы предпочел не делать так, как не было необходимости до перезапуска.

Что может объяснить Application.Current.MainWindow не из того же потока, на котором он был создан?

Cheers.

+0

Только что проверил Application.Current.Dispatcher.Invoke и Application.Current.MainWindow.Dispatcher.Invoke но MainWindow, кажется, на завершенном другом потоке! – bl4kh4k

ответ

0

Свойство MainWindow установлено только в том случае, если в приложении создано первое Window. Когда вы заново создадите окно, вам необходимо обновить свойство MainWindow вручную.

Кроме того, вам не нужно использовать Application.Current, если ваш код запущен в качестве переопределения метода OnStartup для Application.

this.MainWindow = window = new MainWindow(); 
window.ShowInTaskbar = false; 
viewModel = new MainWindowViewModel(...); 
Dispatcher.BeginInvoke(new Action(() => window.DataContext = viewModel)); 
restart = window.ShowDialog(); 

Еще один комментарий: не забывайте, что HD-экраны могут иметь разрешение больше, чем 1080p. Вы должны обновить свой чек с учетом этого:

if (SystemParameters.PrimaryScreenHeight >= 1080) 
+0

this.MainWindow = window = new MainWindow() не фиксирует это ... Я действительно попытался установить его Application.Current.MainWindow = mainWindow этим утром, но не работал. При отладке непосредственно перед ошибкой ... Я могу изучить некоторые свойства MainWindow, но другие, такие как Style, требуют продолжения выполнения для переоценки. – bl4kh4k

Смежные вопросы