当Closing事件被覆盖时,无法调用Close

时间:2018-02-27 14:51:24

标签: c# wpf

在我的MainWindow构造函数中,我错过了Closing事件,因为我需要调用另一个执行某项任务的方法,例如:

    public MainWindow()
    {
        InitializeComponent();

        Closing += (x, y) =>
        {
            y.Cancel = true;
            _discard = true;
            CheckSettings();
        };
    }

    public void CheckSettings(bool x)
    {
       if(x)
         Close(); 
    }
我得到的Close

  窗口关闭后,

无法设置可见性或调用show或showdialog

为什么?

2 个答案:

答案 0 :(得分:1)

(根据您的评论要求...) 您无法从Closing事件处理程序中调用Close。

如果确定表格是否可以关闭的逻辑在CheckSettings

中实现
public MainWindow()
{
    InitializeComponent();

    Closing += (sender, args) =>
    {
        args.Cancel = !CheckSettings();
        ...
    };
}

public bool CheckSettings()
{
   // Check and return true if the form can be closed
}

答案 1 :(得分:0)

在您从事件处理程序(调用CheckSettings之后)返回之前,您正在使用的UI框架可能无法评估您已命名为{EventArgs的内容1}}并设置y

例如,如果您正在使用WPF,Cancel = true方法最终会调用另一个名为VerifyNotClosing的方法(通过Close),在撰写本文时,该方法如下所示:

InternalClose

相关位是第一个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)); } } ,用于检查名为if的成员变量,如果表单处于关闭状态,则抛出异常。 在调用事件处理程序后,_isClosing方法会对EventArgs InternalClose属性的状态作出反应:

Cancel

上面的代码(来自InternalClose方法)调用CancelEventArgs e = new CancelEventArgs(false); try { // The event handler is called here OnClosing(e); } catch { CloseWindowBeforeShow(); throw; } // The status of the .Cancel on the EventArgs is not checked until here if (ShouldCloseWindow(e.Cancel)) { CloseWindowBeforeShow(); } else { _isClosing = false; // 03/14/2006 -- hamidm // WOSB 1560557 Dialog does not close with ESC key after it has been cancelled // // No need to reset DialogResult to null here since source window is null. That means // that ShowDialog has not been called and thus no need to worry about DialogResult. } 之后,这就是为什么后续调用VerifyNotClosing,在第一个之前已经完成,导致异常被抛出。