2013-07-12 97 views
1

我一直在嘗試在窗口內的背景中加載另一個窗口;父窗口在我的情況下充當啓動畫面在後臺加載另一個窗口;當呈現時,關閉父窗口

InitWindow I = null; 
    public InitWindow() 
    { 
     InitializeComponent(); 
     I = this; 

     Thread T = new Thread(() => 
     { 
      MainWindow M = new MainWindow(); 
      M.Show(); 
      M.ContentRendered += M_ContentRendered; 
      System.Windows.Threading.Dispatcher.Run(); 
      M.Closed += (s, e) => M.Dispatcher.InvokeShutdown(); 

     }) { IsBackground = true, Priority = ThreadPriority.Lowest }; 

     T.SetApartmentState(ApartmentState.STA); 
     T.Start(); 
    } 

    void M_ContentRendered(object sender, EventArgs e) 
    { 
     I.Close(); 
    } 

其他一切工作正常,但它在拋出無效運算異常:

I.Close(); 

調用線程,因爲不同的線程擁有它不能訪問該對象。

1)如何切換/同步線程?

2)有更好的解決方法嗎?

+0

對於交互式啓動畫面,我寧願在後臺進行加載和設置,然後在完成後切換窗口的內容... –

+1

@PatrykĆwiek你建議不要使用兩個窗口我應該使用一個? – Umayr

+3

是的,首先顯示內容,做一些加載,然後將主窗口內容切換到您真正想要顯示的內容。當然,這對*交互式*閃屏非常有用,如果你只有一個圖像,那麼將構建操作設置爲「閃屏」,問題就可以毫無魔法地解決。 –

回答

2

更改代碼:

InitWindow I = null; 
    Thread C = null; 

    public InitWindow() 
    { 
     InitializeComponent(); 
     I = this; 
     C = Thread.CurrentThread; 

     Thread T = new Thread(() => 
     { 
      MainWindow M = new MainWindow(); 
      M.Show(); 
      M.ContentRendered += M_ContentRendered; 
      System.Windows.Threading.Dispatcher.Run(); 
      M.Closed += (s, e) => M.Dispatcher.InvokeShutdown(); 

     }) { IsBackground = true, Priority = ThreadPriority.Lowest }; 

     T.SetApartmentState(ApartmentState.STA); 
     T.Start(); 
    } 

    void M_ContentRendered(object sender, EventArgs e) 
    { 
     // Making the parent thread background 
     C.IsBackground = true; 
     // foreground the current thread 
     Thread.CurrentThread.IsBackground = false; 
     // Abort the parent thread 
     C.Abort(); 
    } 

做工精細截至目前,但我不認爲這是一個可靠的解決方案。

相關問題