2011-11-18 41 views
2

所以我有一個WPF應用程序(MVVM)與閃屏。在啓動屏幕啓動時,我在ViewModel上有一個後臺線程,它執行一些啓動相關的活動。在某些情況下,我想打開一些額外的窗口(用戶輸入需要等...)。我在嘗試這樣做時遇到了一些問題/錯誤/異常(主要是圍繞新窗口 - 也是MVVM - 試圖填充它的UI項目,例如組合框)。所以我將問題拉回到了一個更簡單的形式 - 「tempWindow」沒有任何內容,因此它不會拋出UI總體錯誤,但基本上它只是打開它們,一旦後臺線程完成,它們就會關閉它們。如果有人能指出我在正確的方向,我在做什麼不正確,這將不勝感激。從後臺線程ViewModel打開新的Windows

的視圖模型的構造,揭開序幕後臺線程

public SplashScreenViewModel() 
{    
    this.LoadingStatusText = "Starting Startup Processing ... "; 
    this.VersionNumber = "version " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); 

    var threadBackgroundStartUpProcesses = new Thread(new ThreadStart(this.BackgroundStartUpProcesses)); 
    threadBackgroundStartUpProcesses.SetApartmentState(ApartmentState.STA); 
    threadBackgroundStartUpProcesses.IsBackground = true; 
    threadBackgroundStartUpProcesses.Start(); 
} 

後臺線程,應該只開三個窗口(它不會),但這些窗口應該(一旦線程完成disapear)繼續開放。

private void BackgroundStartUpProcesses() 
{ 
    for (int i = 0; i < 3; i++) 
    { 
     var objTempWindow = new tempWindow(); 
     objTempWindow.Show(); 
    } 
} 

//編輯:與resopones更新,現在獲取和錯誤時,TempWindow有正在從TempWindowViewModel填充的組合框。

private void BackgroundStartUpProcesses() 
{ 
    for (int i = 0; i < 3; i++) 
    { 
     var objTempWindow = new tempWindow(); 
     objTempWindow.Show(); 
    } 

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

當它打開TempWindow異常:「調用線程無法訪問此對象,因爲不同的線程擁有它。」被引發,並且似乎是當該窗口上的ComboBox試圖被填充時。

+0

我結束了創建窗口的列表被創建,然後在的結束創建一個事件與窗口的列表,並通過該事件傳遞給WPF SplashScreenView,然後在處理該事件的視圖,循環查看列表並打開窗口...不知道這是最好的,但它的作品 – ChrisHDog

回答

3

我懷疑窗戶需要一個擁有者,當擁有者死​​亡時,窗戶也是如此。打開主線上的窗戶可以讓他們堅持下去。事情是這樣的......

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     var threadBackgroundStartUpProcesses = new Thread(new ParameterizedThreadStart(this.BackgroundStartUpProcesses)); 
     threadBackgroundStartUpProcesses.SetApartmentState(ApartmentState.STA); 
     threadBackgroundStartUpProcesses.IsBackground = true; 
     threadBackgroundStartUpProcesses.Start(System.Windows.Threading.Dispatcher.CurrentDispatcher); 
    } 

    private void BackgroundStartUpProcesses(object d) 
    { 
     System.Windows.Threading.Dispatcher dispatcher = (System.Windows.Threading.Dispatcher) d; 
     for (int i = 0; i < 3; i++) 
     { 
      dispatcher.BeginInvoke((Action)(() => 
      { 
       var objTempWindow = new tempWindow(); 
       objTempWindow.Show(); 

      })); 

     } 

    } 
} 

編輯

我剛剛做了WPF線程一些挖掘,它看起來像你可以打開多線程窗口,但你需要開始新的調度。請參見接近本頁面的結尾:

http://msdn.microsoft.com/en-us/library/ms741870.aspx

在你BackgroundStartupProcessesobjTempWindow.Show()下加入這一行

System.Windows.Threading.Dispatcher.Run(); 
+0

iteresting,這似乎保持最後一個窗口(Dispatcher.Run()的建議),但不是其他兩個... – ChrisHDog

+0

對不起,我的壞。你需要把它放在循環之外,在底部。 – MarcE

+0

謝謝...這絕對適用於這種減少的情況下,希望當我加回到「tempWindow」mvvm它將繼續工作......再次感謝! – ChrisHDog

0

您是否在關閉啓動畫面之前設置MainWindow? WPF將應用程序的第一個打開窗口設置爲MainWindow,除非您更改了App.xamlShutdownMode,則一旦關閉啓動屏幕,應用程序就會關閉。

+0

我不設置MainWindow,我不設置它任何東西App.xaml,然後在Application_Startup上執行var objSplashScreenView = new UI.SplashScreen.SplashScreenView(); objSplashScreenView.ShowCentered(); – ChrisHDog

+0

所以你的啓動畫面變成了MainWindow,當你關閉你的啓動畫面時,它會關閉整個應用程序。擺弄App.xaml中的ShutdownMode或嘗試設置MainWindow。 – hyp