2011-06-16 54 views
0

我遇到了多線程問題 - 我正在研究一個包含兩個窗口的框架:一個surfacwindow和一個普通的wpfwindow。在同一線程中啓動SurfaceWindow和WPF-Window

在我的第一個測試中,SurfaceWindow自動啓動,由於我的visualstudio項目選擇和我的Surface窗口的構造函數,我已經啓動了GUI。 一個線程爲Windows - >沒有問題;)

知道我必須改變順序,我的出發點是一個普通的.cs類,我有線程的困難...對我來說完美的解決方案將是首先啓動SurfaceWindow,然後再啓動WPF-Window,但是在同一個線程中。

但我不希望在SurfaceWindow的構造函數中啓動WPF窗口,但效果相同!

代碼導致穿線問題: (因爲對象被另一個線程擁有的調用線程不能訪問這個對象)

public Constructor() 
    { 

     Thread t = new Thread(new ThreadStart(StartSurfaceWIndowThread)); 
     t.SetApartmentState(ApartmentState.STA); 
     t.Start(); 

     startWindow(); 

    } 

    private void StartNewStaThread() { 

     AdaptivePrototype.App app = new AdaptivePrototype.App(); 
     app.InitializeComponent(); 
     app.Run(); 

    } 

    private void startWindow() 
    { 
      Thread thread = new Thread(() => 
      { 
       WPFkGui w = new WPFGui(this); 
       w.Show(); 

       System.Windows.Threading.Dispatcher.Run(); 
      }); 

      thread.SetApartmentState(ApartmentState.STA); 
      thread.Start(); 

    } 

現在這將是完美的解決方案的代碼,但它不顯示WPFGUI:

public Constructor() 
    { 

     Thread t = new Thread(new ThreadStart(StartSurfaceWIndowThread)); 
     t.SetApartmentState(ApartmentState.STA); 
     t.Start(); 

     startWindow(); 

    } 

    private void StartNewStaThread() { 

     AdaptivePrototype.App app = new AdaptivePrototype.App(); 
     app.InitializeComponent(); 
     app.Run(); 
    WPFkGui w = new WPFGui(this); 
     w.Show(); 

    } 

我會很樂意提供任何幫助! 謝謝, 克里斯

回答

1

我知道你想要2個窗口啓動時顯示,並能夠互相交流。沒有花哨的線程代碼是必要的。

打開你的App.xaml文件。 「StartupUri」有一個attrbibute。刪除 - 這基本上是告訴WPF在應用程序啓動時顯示特定窗口的快捷方式...您可以跳過該代碼並在自己的啓動行爲中進行編碼。要做到這一點,下次打開App.xaml.cs並插入沿着線的東西:

 Window1 window1 = new Window1(); 
     Window2 window2 = new Window2(window1); 

     window1.Show(); 
     window2.Show(); 

在假定你的窗口類被命名爲窗口1和窗口2,並且您添加了一個構造函數窗口2是需要Window1的一個實例。

+0

再次感謝你 - 你的方法完美無缺! – 2011-06-17 14:10:47