2016-10-21 7 views
0

은 내가 caliburn.micro WPF 응용 프로그램을 가지고, 나는이 함수를 호출 F 번호에서 그것을 시작 해요 :배경 스레드의 Caliburn.Micro 응용 프로그램에서 만든 GUI 창 액세스 중?

  public void LaunchGUI() 
      { 
       if (_guiWindow == null) 
       { 
        var windowThread = new Thread(() => 
        { 
         try 
         { 
          // Create our context, and install it: 
          SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher)); 

          AppBootstrapper.Initialize(); 
          var app = new App(); 
          app.InitializeComponent(); 


          //guiWindow = app.MainWindow; 
          //// When the window closes, shut down the dispatcher 
          //guiWindow.Closed += (s, e) => 
          // Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background); 
          //guiWindow.Closed += (s, e) => 
          // guiWindow = null; 
          //guiWindow.WindowState = WindowState.Minimized; 
          //guiWindow.Show(); 
          //guiWindow.WindowState = WindowState.Normal; 
          //guiWindow.Activate(); 
          // Start the Dispatcher Processing 
          Dispatcher.Run(); 
         } 
         catch (Exception e) 
         { 
          LogMessage("error in gui thread: " + e); 
          //guiWindow.Close(); 
          //guiWindow = null; 
         } 

        }); 
        windowThread.SetApartmentState(ApartmentState.STA); 
        windowThread.IsBackground = true; 
        windowThread.Start(); 
       } 
       else 
       { 
        _guiWindow.WindowState = WindowState.Minimized; 
        _guiWindow.Show(); 
        _guiWindow.WindowState = WindowState.Normal; 
        _guiWindow.Activate(); 
       } 
      } 
     } 

문제는 내가 메인 윈도우에 대한 참조를 가질 필요가있다 그래서 여전히 열려 있는지 여부를 추적 할 수 있지만 항상 null입니다 (따라서 주석 코드).

public void ShowGui() 
    { 
     if (guiWindow == null) 
     { 
      var windowThread = new Thread(() => 
      { 
       try 
       { 
        // Create our context, and install it: 
        SynchronizationContext.SetSynchronizationContext(
         new DispatcherSynchronizationContext(
          Dispatcher.CurrentDispatcher)); 

        guiWindow = new MainWindow(); 
        // When the window closes, shut down the dispatcher 
        guiWindow.Closed += (s, e) => 
         Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background); 
        guiWindow.Closed += (s, e) => 
         guiWindow = null; 
        guiWindow.WindowState = WindowState.Minimized; 
        guiWindow.Show(); 
        guiWindow.WindowState = WindowState.Normal; 
        guiWindow.Activate(); 

        // Start the Dispatcher Processing 
        Dispatcher.Run(); 
       } 
       catch (Exception) 
       { 
        try 
        { 
         guiWindow.Close(); 
        } 
        catch (Exception) 
        { 

         throw; 
        } 
        guiWindow = null; 
       } 

      }); 
      windowThread.SetApartmentState(ApartmentState.STA); 
      windowThread.IsBackground = true; 
      windowThread.Start(); 
     } 
     else 
     { 
      guiWindow.WindowState = WindowState.Minimized; 
      guiWindow.Show(); 
      guiWindow.WindowState = WindowState.Normal; 
      guiWindow.Activate(); 
     } 
    } 

내 질문은 어떻게 만들어 메인 창에 접근 할있다 : "정상적인"MVVM 응용 프로그램을 실행하고, 비슷한 방법으로 그것을 초기화 할 때이 잘 작동합니다?

답변

2

가 //이 같은 응용 프로그램을 메인 윈도우를 얻을 수 :

VAR _guiWindow = Application.Current.MainWindow MainWindow를 같은;

+0

여기에서 만든 주 스레드 또는 GUI 스레드에서 액세스하려고하든 항상 null입니다. – odkken

+0

신경 쓰지 마라. 스레딩 문제인 것 같다. (초기화하기 위해 잠시 기다려야한다.) 이제는 다른 스레드에서 얻으려는 문제가 있지만 다른 주제입니다. 감사. – odkken