2011-08-03 40 views
0

對話框重用的問題,我有一個WPF對話框,我收到以下錯誤,當我嘗試重新顯示對話框拋出一個異常後...WPF - 在發生異常時

「不能設置可見或在窗口關閉後調用Show,ShowDialog或WindowInteropHelper.EnsureHandle。「

我已經做了解決該問題的一些閱讀,如果你嘗試重新展現一個封閉的對話通常會出現此消息,但我不重用的對話框......

Dialog dialog = new Dialog(); 
Exception exception = null; 
IDisposable disposable = this.subject.Subscribe(
b => 
{ 
    dialog.DialogResult = b; 
    dialog.Close(); 
}, 
ex => 
{ 
    dialog.Close(); 
    exception = new Exception("An unexpected error occured", ex); 
}); 

bool? dialogResult = dialog.ShowDialog(); 
disposable.Dispose(); 
if (exception != null) 
{ 
    throw exception; 
} 

我可以執行此代碼儘可能多的次數,直到拋出異常,這是上面的消息顯示在顯示對話框上的時間。該代碼正在主UI線程上執行。

有沒有人有任何想法,爲什麼拋出異常停止顯示新的對話框?

問候, 傑森

回答

-1

感謝您的回覆。我已經設法解決這個問題,但我不能100%確定爲什麼這能解決問題。下面的代碼是什麼樣子現在...

Dialog dialog = new Dialog(); 
Exception exception = null; 
this.subject = new Subject<bool>(); 
IDisposable disposable = this.subject 
    .ObserveOnDispatcher() 
    .Subscribe(
     b => 
     { 
       dialog.DialogResult = b; 
       dialog.Close(); 
     }, 
     ex => 
     { 
       dialog.Close(); 
       exception = new Exception("An unexpected error occurred.", ex); 
     }); 

bool? dialogResult = dialog.ShowDialog(); 
disposable.Dispose(); 
if (exception != null) 
{ 
    throw exception; 
} 

的關鍵是使用ObserveOnDispatcher(),我想,也許錯誤處理程序在後臺線程這是導致怪beahviour調用dialog.Close() ,但不管我是否使用ObserveOnDispatcher(),OnError處理程序仍然在主UI線程上被觸發,很奇怪!

我還需要每次調用OnError一次,任何訂閱主題的內容都會立即觸發OnError!另一種手動處理訂閱的方法可能是在OnNext處理程序中調用subject.OnCompleted,但我認爲調用dispose更爲明顯。

0

你不應該自己調用Dispose(),這可能會導致大量的與部分設置對象的問題。改爲使用using塊。

拋出的異常很可能導致對話對象的部分丟棄導致錯誤。

Dialog自定義類嗎?我不認爲它是WPF的一部分。如果是這樣,請確保您正確執行IDisposable(根據MSDN)。

0

不知道subject.Subscribe是做什麼的,確實有點難以確定,但我認爲這就是發生了什麼。

Subscribe方法在一切正常時不會立即返回,因此在調用ShowDialog之後纔會調用您的成功委託。

但是,它似乎在得到一個異常後立即在Subscribe之後調用失敗委託。然後,當您撥打ShowDialog時,您的DialogClose已被調用,因此會拋出您正在討論的異常。

你可以看到相同的行爲,如果你要做到以下幾點:

dialog.Close() 
dialog.ShowDialog() 

此外,在不知道的主題類的細節,我真的不能提供解決您特定問題的一種方式,但希望你能從這裏找到你的問題。