概述
何谓模式窗体?简单的可以理解为窗体对话框,用户必须在完成该窗体上的操作或关闭窗体后才能返回打开此窗体的窗体。本文不对模式窗体的定义、特征、功能做具体讨论,主要把重点放在如何在.net窗体应用程序中有效的使用模式窗体,解决使用模式窗体中碰到的常见问题。
模式窗体的属性设置
在.net中一个System.Windows.Forms.Form类就表示一个窗体,通过visual studio 2005设计器能够直接添加窗体,切换到设计模式,在属性窗口中会显示属于该窗体的属性和事件。参照标准的模式窗体,以visual studio 2005程序的菜单工具->选项打开的那个选项对话框为例,对于设计器初始化的窗体还是需要进行一番设置才能达到专业化。令人高兴的是这些设置都可以在设计器模式中通过属性设置实现,笔者将通过代码来实现相应功能,下面对其进行详细描述。
Form.StartPosition属性,确定窗体第一次出现时的位置。这里设置为在父窗体的中间显示。
this.StartPosition = FormStartPosition.CenterParent;
Form.HelpButton属性,确定窗体的标题栏上是否有“帮助”按钮。设置显示,看上去更人性化,但实际不一定会对帮助功能进行实现。
this.HelpButton = true;
Form.MaximizeBox属性,确定窗体标题栏的右上角是否有最大化框。设置不让她显示。
this.MaximizeBox = false;
Form.MinimizeBox属性,确定窗体标题栏的右上角是否有最小化框。设置不让他显示。
this.MinimizeBox = false;
Form.ShowIcon属性,指示是否在窗体的标题栏中显示图标。设置不显示。
this.ShowIcon = false;
Form.ShowInTaskbar属性,确定窗体是否出现在Windows任务栏中。这个当然要节省任务栏的宝贵空间。
this.ShowInTaskbar = false;
Form.FormBorderStyle属性,指示窗体的边框和标题栏的外观和行为。设置这个属性将不允许拖动调整窗体的大小,同时Icon属性将失效,并不显示窗体标题栏图片。
this.FormBorderStyle = FormBorderStyle.FixedDialog;
Form.ControlBox属性,确定窗体是否有“控件/系统”菜单框。通过该设置可以隐藏标题栏的控制按钮。在有些时候还是有必要设置为False,标题栏就不会再有控制按钮。
this.ControlBox = false;
通过对以上属性的设置,基本实现模式窗体的静态功能。对于是否允许调整窗体的大小可根据实际情况而定。
模式窗体中的按钮
模式窗体中(比如visual studio 2005中的“选项”对话框)一般会有两个基本按钮,一个[确定]按钮用来提交,另一个[取消]按钮用来撤销提交,有时候会增加一个[应用]按钮,不过像“帮助”菜单中的“关于”模式窗体可能就只有一个[确定]按钮。Windows窗体为用户操作友好性提供了比较好的支持。我们可以在Form设计界面的属性设置中找到AcceptButton和CancelButton两个属性,默认值为空即显示(无)。在属性中可以通过选择窗体上的按钮来设置值。属性修改生成的代码如下。
先定义两个Button,
private System.Windows.Forms.Button buttonOK;
private System.Windows.Forms.Button buttonCancel;
窗体的“接受”按钮。如果设置了此按钮,则用户每次按“Enter”键都相当于“单击”了该按钮。
this.AcceptButton = this.buttonOK;
窗体的“取消”按钮。如果设置了此按钮,则用户每次按“Esc”键都相当于“单击”了该按钮。
this.CancelButton = this.buttonCancel;
可见可以通过快捷键来方便的访问特定按钮,但这个有一些例外,比如窗体焦点刚好在buttonCancel上,当按{Enter}时实际按下的键会是buttonCancel而不是buttonOK,如果焦点停在第三个按钮上,那{Enter}按下相当于点击了该按钮。另一个细节是通过鼠标点击按钮和快捷键操作按钮的表现行为不一样,快捷键操作Button不会显示按钮被按下的显示效果,看上去什么都没有发生。
模式窗体的打开与关闭
谈到模式窗体的打开,一般通过Form.ShowDialog ()方法或她的一个重载Form.ShowDialog (IWin32Window)来实现,其中后一个方法将窗体显示为具有指定所有者的模式对话框。如下代码所示,
OptionForm form = new OptionForm();
//form.ShowDialog();
form.ShowDialog(this);
对于指定所有者方式打开的模式窗体可以在模式窗体内部获取主窗体的引用,
//在模式窗体内部访问所属窗体
MainForm form = this.Owner as MainForm;
注意,如果以Form.ShowDialog ()方式打开,那Form.Owner属性会是空引用。
谈到模式窗体的关闭,先来看一下模式窗体关闭后的返回值。无论是调用Form.ShowDialog ()方法还是Form.ShowDialog (IWin32Window)方法,都会在模式窗体关闭时返回System.Windows.Forms.DialogResult枚举值。参考MSDN,该枚举包含的值如下,
DialogResult.Abort,对话框的返回值是 Abort(通常从标签为“中止”的按钮发送)。
DialogResult.Cancel,对话框的返回值是 Cancel(通常从标签为“取消”的按钮发送)。
DialogResult.Ignore,对话框的返回值是 Ignore(通常从标签为“忽略”的按钮发送)。
DialogResult.No,对话框的返回值是 No(通常从标签为“否”的按钮发送)。
DialogResult.None,从对话框返回了 Nothing。这表明有模式对话框继续运行。
DialogResult.OK,对话框的返回值是 OK(通常从标签为“确定”的按钮发送)。
DialogResult.Retry,对话框的返回值是 Retry(通常从标签为“重试”的按钮发送)。
DialogResult.Yes,对话框的返回值是 Yes(通常从标签为“是”的按钮发送)。
由于某些原因在实际用户操作中比如选项数据无法保存,输入的设置数据有问题,点击[确定]按钮需要阻止窗体的关闭以对输入的设置进行调整。对于一些开发者在技术社区贴的阻止模式窗体关闭的代码,我认为不是很好的实现。以下用代码来描述该实现,注意其中用到了三个事件。
//注册窗体关闭事件
this.FormClosing +=
何谓模式窗体?简单的可以理解为窗体对话框,用户必须在完成该窗体上的操作或关闭窗体后才能返回打开此窗体的窗体。本文不对模式窗体的定义、特征、功能做具体讨论,主要把重点放在如何在.net窗体应用程序中有效的使用模式窗体,解决使用模式窗体中碰到的常见问题。
模式窗体的属性设置
在.net中一个System.Windows.Forms.Form类就表示一个窗体,通过visual studio 2005设计器能够直接添加窗体,切换到设计模式,在属性窗口中会显示属于该窗体的属性和事件。参照标准的模式窗体,以visual studio 2005程序的菜单工具->选项打开的那个选项对话框为例,对于设计器初始化的窗体还是需要进行一番设置才能达到专业化。令人高兴的是这些设置都可以在设计器模式中通过属性设置实现,笔者将通过代码来实现相应功能,下面对其进行详细描述。
Form.StartPosition属性,确定窗体第一次出现时的位置。这里设置为在父窗体的中间显示。
this.StartPosition = FormStartPosition.CenterParent;
Form.HelpButton属性,确定窗体的标题栏上是否有“帮助”按钮。设置显示,看上去更人性化,但实际不一定会对帮助功能进行实现。
this.HelpButton = true;
Form.MaximizeBox属性,确定窗体标题栏的右上角是否有最大化框。设置不让她显示。
this.MaximizeBox = false;
Form.MinimizeBox属性,确定窗体标题栏的右上角是否有最小化框。设置不让他显示。
this.MinimizeBox = false;
Form.ShowIcon属性,指示是否在窗体的标题栏中显示图标。设置不显示。
this.ShowIcon = false;
Form.ShowInTaskbar属性,确定窗体是否出现在Windows任务栏中。这个当然要节省任务栏的宝贵空间。
this.ShowInTaskbar = false;
Form.FormBorderStyle属性,指示窗体的边框和标题栏的外观和行为。设置这个属性将不允许拖动调整窗体的大小,同时Icon属性将失效,并不显示窗体标题栏图片。
this.FormBorderStyle = FormBorderStyle.FixedDialog;
Form.ControlBox属性,确定窗体是否有“控件/系统”菜单框。通过该设置可以隐藏标题栏的控制按钮。在有些时候还是有必要设置为False,标题栏就不会再有控制按钮。
this.ControlBox = false;
通过对以上属性的设置,基本实现模式窗体的静态功能。对于是否允许调整窗体的大小可根据实际情况而定。
模式窗体中的按钮
模式窗体中(比如visual studio 2005中的“选项”对话框)一般会有两个基本按钮,一个[确定]按钮用来提交,另一个[取消]按钮用来撤销提交,有时候会增加一个[应用]按钮,不过像“帮助”菜单中的“关于”模式窗体可能就只有一个[确定]按钮。Windows窗体为用户操作友好性提供了比较好的支持。我们可以在Form设计界面的属性设置中找到AcceptButton和CancelButton两个属性,默认值为空即显示(无)。在属性中可以通过选择窗体上的按钮来设置值。属性修改生成的代码如下。
先定义两个Button,
private System.Windows.Forms.Button buttonOK;
private System.Windows.Forms.Button buttonCancel;
窗体的“接受”按钮。如果设置了此按钮,则用户每次按“Enter”键都相当于“单击”了该按钮。
this.AcceptButton = this.buttonOK;
窗体的“取消”按钮。如果设置了此按钮,则用户每次按“Esc”键都相当于“单击”了该按钮。
this.CancelButton = this.buttonCancel;
可见可以通过快捷键来方便的访问特定按钮,但这个有一些例外,比如窗体焦点刚好在buttonCancel上,当按{Enter}时实际按下的键会是buttonCancel而不是buttonOK,如果焦点停在第三个按钮上,那{Enter}按下相当于点击了该按钮。另一个细节是通过鼠标点击按钮和快捷键操作按钮的表现行为不一样,快捷键操作Button不会显示按钮被按下的显示效果,看上去什么都没有发生。
模式窗体的打开与关闭
谈到模式窗体的打开,一般通过Form.ShowDialog ()方法或她的一个重载Form.ShowDialog (IWin32Window)来实现,其中后一个方法将窗体显示为具有指定所有者的模式对话框。如下代码所示,
OptionForm form = new OptionForm();
//form.ShowDialog();
form.ShowDialog(this);
对于指定所有者方式打开的模式窗体可以在模式窗体内部获取主窗体的引用,
//在模式窗体内部访问所属窗体
MainForm form = this.Owner as MainForm;
注意,如果以Form.ShowDialog ()方式打开,那Form.Owner属性会是空引用。
谈到模式窗体的关闭,先来看一下模式窗体关闭后的返回值。无论是调用Form.ShowDialog ()方法还是Form.ShowDialog (IWin32Window)方法,都会在模式窗体关闭时返回System.Windows.Forms.DialogResult枚举值。参考MSDN,该枚举包含的值如下,
DialogResult.Abort,对话框的返回值是 Abort(通常从标签为“中止”的按钮发送)。
DialogResult.Cancel,对话框的返回值是 Cancel(通常从标签为“取消”的按钮发送)。
DialogResult.Ignore,对话框的返回值是 Ignore(通常从标签为“忽略”的按钮发送)。
DialogResult.No,对话框的返回值是 No(通常从标签为“否”的按钮发送)。
DialogResult.None,从对话框返回了 Nothing。这表明有模式对话框继续运行。
DialogResult.OK,对话框的返回值是 OK(通常从标签为“确定”的按钮发送)。
DialogResult.Retry,对话框的返回值是 Retry(通常从标签为“重试”的按钮发送)。
DialogResult.Yes,对话框的返回值是 Yes(通常从标签为“是”的按钮发送)。
由于某些原因在实际用户操作中比如选项数据无法保存,输入的设置数据有问题,点击[确定]按钮需要阻止窗体的关闭以对输入的设置进行调整。对于一些开发者在技术社区贴的阻止模式窗体关闭的代码,我认为不是很好的实现。以下用代码来描述该实现,注意其中用到了三个事件。
//注册窗体关闭事件
this.FormClosing +=