2016-07-22 84 views
0

我開發了一個使用高級第三方UserControl的WPF應用程序; UserControl顯示一個交互式地圖。如果我通過在XAML中指定StartupUri="MainWindow"來打開應用程序的主窗口,或者如果我使用app.Run(new MainWindow())從代碼啓動應用程序,那麼一切正常。但是,如果我不是處理應用程序啓動時這樣使用Application.StartupUri和處理WPF中的啓動事件之間的區別?

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    new MainWindow().Show(); 
} 

然後我得到以下情況例外,當我開始與地圖交互:

不能使用屬於不同的線程比爲DependencyObject它的父級Freezable。

爲什麼會發生這種情況 - 哪種線程在啓動應用程序的這些不同方式之間做了什麼?下面是異常的部分堆棧跟蹤:

at System.Windows.Freezable.EnsureConsistentDispatchers(DependencyObject owner, DependencyObject child) 
at System.Windows.Freezable.OnFreezablePropertyChanged(DependencyObject oldValue, DependencyObject newValue, DependencyProperty property) 
at System.Windows.Media.RenderData.PropagateChangedHandler(EventHandler handler, Boolean adding) 
at System.Windows.Media.DrawingVisual.RenderClose(IDrawingContent newContent) 
at System.Windows.Media.RenderDataDrawingContext.DisposeCore() 
at System.Windows.Media.DrawingContext.System.IDisposable.Dispose() 
at some3rdPartyClass.BuildVisual(Brush fg, Brush bg) 
+0

@Machine學習是你的問題,爲什麼我會要處理的Startup事件呢?如果是這樣的話:提出的問題顯示了一個簡化的例子;實際上我想用不同的參數調用MainWindow的構造函數。 –

+0

我該如何重現此問題? – 2016-07-22 13:19:27

+1

對不起,我不知道如何沒有相同的第三方用戶控件(我無權共享)重現它。 –

回答

0

假設第三方(但顯然我不能測試它)調用線程,出現這種情況是在UI時,其中一個XAML在starturi ....

試試這個

Application.Current.Dispatcher.Invoke(
    new Action(() => { 
     //pls share what kind of arguments you're using... 
     new MainWindow().Show(); 
    }) 
    ); 
+0

謝謝 - 工作!但它並不完全回答我的原始問題 - 爲什麼這兩種方法之間存在這種差異? –

+0

請標記爲回答:-),它解釋說,當線程不是從starturi開始的時候線程不是UI – 2016-07-22 14:02:33

+0

應用程序實際上是一個支持各種插件的主機,參數是要使用的插件列表(並且有幾個不同的發射器(可執行文件)使用不同的列表)。雖然在測試這個bug時,我已經使用了沒有參數的基本構造函數。 –

相關問題