2012-04-23 62 views
0

我正在使用WPF。我使用Dispatcher在主xaml窗口中運行線程進程。用STA線程錯誤打開另一個xaml窗口

然後我得到這個錯誤打開另一WPF展示顯示3D圖像的結果:

{「調用線程必須爲STA,因爲許多UI組件都需要 這個」}

這是我如何開始一個新的窗口:在一些POS加入這個

void DisplayFormThread() 
{ 
    IResult result = _mainWindow.GetResult(); 
    ResultView resultView = new ResultView (result); 
    resultView.Show(); 
} 

我試圖解決這個問題ts在stackoverflow但它沒有幫助:

ThreadStart start = delegate() 
{ 
    DispatcherOperation op = Dispatcher.CurrentDispatcher.BeginInvoke(
     new delegateNewWindow(DisplayFormThread), DispatcherPriority.Background); 

     DispatcherOperationStatus status = op.Status; 
        while (status != DispatcherOperationStatus.Completed) 
        { 
          status = op.Wait(TimeSpan.FromMilliseconds(1000)); 
          if (status == DispatcherOperationStatus.Aborted) 
          { 
           // Alert Someone 
          } 
        } 

     }; 

// Create the thread and kick it started! 
Thread thread = new Thread(start); 
thread.SetApartmentState(ApartmentState.STA); 
thread.Start(); 

我該如何解決問題?

在此先感謝。

回答

3

原因是我們新創建的線程未啓用以支持WPF窗口基礎結構。特別是,它不支持Windows消息泵,您必須爲新創建的窗口運行單獨的調度程序。 Here is sample for this

2

WPF要求thred是STA型的,所以如果你想DisplayFormThread由STA被稱爲THEAD你必須做這樣的事情:

Thread newThread = new Thread(new ThreadStart(DisplayFormThread)); 
newThread.SetApartmentState(ApartmentState.STA); 
newThread.Start(); 

STAThread是指「單線程單元」,這指的是當前(主)線程使用的線程模型。基本上,通過[STAThread]聲明,其他應用程序將知道您的線程在發送數據時的策略。 STA模型是Windows線程/應用程序最常見的線程模型。您可以閱讀更多關於Apartment State here的文章。

+0

感謝您的回答。我已經試過這個,因爲我也在我的問題中加入了這個。但是,在新窗口中的結果未顯示... – olidev 2012-04-23 08:58:03