我正在编写一个Windows应用程序,它基本上在后台运行,带有一个通知图标来与之交互。通知图标可以做一些基本的事情,如退出应用程序或显示有关它的信息。它还可以启动模式配置对话框。
创建对话框的代码非常简单:
using(var frmSettings = new SettingsForm(configuration))
{
frmSettings.ConfigurationChanged += ConfigurationChangedHandler;
frmSettings.UnhandledException += UnhandledExceptionHandler;
frmSettings.ShowDialog();
}
这个
SettingsForm
班级基本上有三个
GroupBox
控件,带有
Label
和
TextBox
各控制,4
Button
底部的控件:
"Advanced..."
,
"Restore Defaults"
,
"Cancel"
和
"Apply"
. 各
文本框
有一个
Validating
事件处理程序通过设计器连接起来。每个按钮都有一个
Click
处理程序通过设计器连接起来。它们中的每一个都非常明显:用更高级的设置打开另一个模式对话框,将文本框还原为其默认值,关闭对话框,或保存更改,激发
ConfigurationChanged
事件,以及
然后
关闭对话框(但仅当所有字段都有效时!).
当有表单输入错误时,我取消相应的
验证
按设置的事件
((CancelEventArgs)e).Cancel = true
. 但是,这两个表单的默认行为是防止用户在验证失败时更改焦点。我发现这很烦人,最终发现设计器中的选项仍然可以在用户离开字段时自动验证,但允许他们离开,即使验证失败:
AutoValidate = EnableAllowFocusChange
〔1〕
我的
“申请”
按钮
点击
处理程序基本上如下所示:
private void btnApply_Click(object sender, EventArgs e)
{
try
{
if(this.ValidateChildren())
{
this.Configuration.Field1 = this.txtField1.Text;
this.Configuration.Field2 = this.txtField2.Text;
this.Configuration.Field3 = this.txtField3.Text;
if(this.Configuration.Changed)
{
this.Configuration.Save();
this.OnConfigurationChanged(new ConfigurationChangedEventArgs(
this.Configuration));
}
this.Close();
}
}
catch(Exception ex)
{
this.OnUnhandledException(new UnhandledExceptionEventArgs(
"Failed To Apply Configuration Settings",
ex));
}
}
我目前正在测试代码,方法是在第一行中断,然后一行一行地通过方法。基本上,
ValidateChildren
按预期返回假
if
块,包括
this.Close()
跳过。然而,如果我一路走到方法的底部,然后离开它,我最终会回到
frmSettingsForm.ShowDialog()
线条和形状神奇地闭合了。
这个
“申请”
按钮设置为窗体的
AcceptButton
. 我想知道它是否隐式地将一个处理程序附加到按钮的
点击
事件在按下按钮时自动关闭窗体。这听起来不符合逻辑,尤其是考虑到似乎没有一种方法可以取消
点击
但这是我唯一能想到的解释。为了检验这一理论,我试图使
默认按钮
在设计器中,但当数据无效时,窗体仍将关闭。
什么是关闭我的表格,我如何阻止它?
[1]:如果其他人找不到它,它是一个窗体属性,而不是每个单独控件的属性(如我预期的那样)。