2011-08-03 39 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() 

此外,在不知道的主题类的细节,我真的不能提供解决您特定问题的一种方式,但希望你能从这里找到你的问题。