【问题标题】:Cannot call specific method on closing关闭时无法调用特定方法
【发布时间】:2018-08-04 12:35:22
【问题描述】:

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

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

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

}

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

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

我做错了什么?

【问题讨论】:

  • 我没有看到任何设置可见性或调用 Show 的代码。无论如何,您为什么在关闭时退出应用程序?这不会发生吗?还是您的表格是从另一个表格中调用的?在后一种情况下,您应该关闭 parent 窗口,而不是程序。
  • 因为我在另一种方法中也使用了exit方法,所以我无法在关闭事件中关闭应用程序但我需要调用exit

标签: c# wpf


【解决方案1】:

当调用Closing 事件时,您似乎正在调用Close();。在我看来,您正在尝试关闭一个已经在关闭自身的窗口。

也就是说,如果您仍然希望 Exit() 方法在您的 someVariable 为 false 时关闭。使用布尔值跟踪表单的“关闭”状态,如下所示:

private bool _isClosing = false;
public FooWindow()
{
   Closing += (x, y) => {
       _isClosing = true;
       Exit(); 
   };
}

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

}

【讨论】:

    【解决方案2】:

    问题是您在窗口已经关闭时调用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()
    

    【讨论】:

    【解决方案3】:

    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));
         }
    }
    

    _isClosing 在您第一次访问时被InternalClose() 设置为true。 SR.Get(SRID.InvalidCompositionTarget) 是您看到的错误消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      相关资源
      最近更新 更多