我有一个窗口,当这个窗口关闭时我需要触发一个特定的方法,我做了:
public FooWindow()
{
Closing += (x, y) => Exit();
}
private void Exit()
{
if (someVariable)
{
Environment.Exit(1);
}
else
{
Close();
}
}
当调用Exit事件时,达到了close方法,但我得到了
System.InvalidOperationException:窗口关闭后,无法设置可见性或调用Show,ShowDialog或WindowInteropHelper.EnsureHandle。
我做错了什么?
答案 0 :(得分:1)
当调用Close();
事件时,您似乎在调用Closing
。对我来说,你试图关闭一个已经处于关闭过程中的窗口。
也就是说,如果您的Exit()
为假,您仍希望关闭someVariable
方法。使用布尔值跟踪表单的“关闭”状态,如下所示:
private bool _isClosing = false;
public FooWindow()
{
Closing += (x, y) => {
_isClosing = true;
Exit();
};
}
private void Exit()
{
if (someVariable)
{
Environment.Exit(1);
}
else
{
if (!_isClosing) Close();
}
}
答案 1 :(得分:1)
问题是您在窗口关闭时正在调用Close()
。因此,WPF会检查该方案并启动异常以注意错误。这里的调用堆栈我重现了你的问题。请注意,启动异常的代码具有不言而喻的名称VerifyNotClosing
:
in System.Windows.Window.VerifyNotClosing()
in System.Windows.Window.InternalClose(Boolean shutdown, Boolean ignoreCancel)
in System.Windows.Window.Close()
in WpfApp1.MainWindow.MainWindow_Closing(Object sender, CancelEventArgs e) in MainWindow.xaml.cs:line 32
in System.Windows.Window.OnClosing(CancelEventArgs e)
in System.Windows.Window.WmClose()
答案 2 :(得分:0)
Window.Close()调用InternalClose(),调用VerifyNotClosing()会抛出:
第一次访问时{p>private void VerifyNotClosing() { if (_isClosing == true) { throw new InvalidOperationException(SR.Get(SRID.InvalidOperationDuringClosing)); } if (IsSourceWindowNull == false && IsCompositionTargetInvalid == true) { throw new InvalidOperationException(SR.Get(SRID.InvalidCompositionTarget)); } }
_isClosing
被InternalClose()
设置为true。 SR.Get(SRID.InvalidCompositionTarget)
是您看到的错误消息。