2016-10-21 6 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です(したがってコメント付きコード)。 「通常の」MVVMアプリ、および同様の方法でそれを初期化を実行するときに、これは正常に動作します注意:

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(); 
     } 
    } 

私の質問は、私が作成したメインウィンドウへのアクセスを得るのですかですか?

答えて

2

//あなたはこのようなアプリケーションのメインウィンドウゲット:

VAR _guiWindow = Application.Current.MainWindowがメインウィンドウとして、

+0

ここで作成したメインスレッドまたはGUIスレッドからアクセスしようとしても、これは常にnullです。 – odkken

+0

気にする必要はありませんが、スレッドの問題だったようです(初期化するのに少し待つ必要があります)。今私は別のスレッドからそれを取得しようとする問題を抱えていますが、それは別のトピックです。ありがとう。 – odkken

関連する問題