2012-11-14 52 views
4

我正在運行測試單元(並瞭解它們)。很簡單,我的單位創建一個List並將其傳遞給我的MainWindow。顯示來自測試單元的WPF窗口

我的問題是我的show()單元方法結束的主窗口。我想單位不完成,直到我關閉MainWindow。這就是我所做的(見下文) - 它顯然不起作用,感覺我在這裏走錯了路。我怎樣才能正確地做到這一點?

[TestClass] 
    public class Logging 
    { 
     bool continueOn = true; 
     [TestMethod] 
     public void ShowLogs() 
     { 
      ShowResults(createLogList()); 
     } 

     private void ShowResults(List<Log> logList) 
     { 
      MainWindow mw = new MainWindow(logList); 
      mw.Closed += mw_Closed; 
      mw.Show(); 

      while (continueOn) 
      { } 
     } 

     void mw_Closed(object sender, EventArgs e) 
     { 
      this.continueOn = false; 
     } 

     private List<Log> createLogList() 
     { 
      List<Log> listLog = new List<Log>(); 
      //logic 
      return listLog;    
     } 

也許我得把這個到後臺輔助線程和監控 - 說實話我不知道之前我浪費時間,我會很感激一些指導。

回答

11

必須創建WPF窗口並將其顯示在支持WPF窗口基礎結構(消息泵)的線程上。

[TestMethod] 
    public void TestMethod1() 
    { 
     MainWindow window = null; 

     // The dispatcher thread 
     var t = new Thread(() => 
     { 
      window = new MainWindow(); 

      // Initiates the dispatcher thread shutdown when the window closes 
      window.Closed += (s, e) => window.Dispatcher.InvokeShutdown(); 

      window.Show(); 

      // Makes the thread support message pumping 
      System.Windows.Threading.Dispatcher.Run(); 
     }); 

     // Configure the thread 
     t.SetApartmentState(ApartmentState.STA); 
     t.Start(); 
     t.Join(); 
    } 

需要注意的是:

  • 的窗口必須創建新的線程中所示。
  • 您必須在ThreadStart返回之前啓動一個調度程序(System.Windows.Threading.Dispatcher.Run()),否則該窗口將很快顯示並死亡。
  • 線程必須配置爲在STA公寓中運行。

欲瞭解更多信息,請訪問this link

2

當然,因爲它是僅用於測試,使用

ShowDialog() 

可能是一種選擇而不是 '顯示()'