关闭时无法调用特定方法

时间:2018-02-24 16:32:03

标签: c# wpf

我有一个窗口,当这个窗口关闭时我需要触发一个特定的方法,我做了:

public FooWindow()
{
   Closing += (x, y) => Exit();
}

private void Exit()
{
   if (someVariable)
   {
       Environment.Exit(1);
   }
   else
   {
      Close(); 
   }

}

当调用Exit事件时,达到了close方法,但我得到了

  

System.InvalidOperationException:窗口关闭后,无法设置可见性或调用Show,ShowDialog或WindowInteropHelper.EnsureHandle。

我做错了什么?

3 个答案:

答案 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()会抛出:

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));
     }
}
第一次访问时{p> _isClosingInternalClose()设置为true。 SR.Get(SRID.InvalidCompositionTarget)是您看到的错误消息。