在我的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
为什么?
答案 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
,在第一个之前已经完成,导致异常被抛出。