C#模式窗体的打开与关闭是如何实现的呢,让我们先来看看C#模式窗体的打开,一般通过Form.ShowDialog ()方法或她的一个重载Form.ShowDialog (IWin32Window)来实现,其中后一个方法将窗体显示为具有指定所有者的模式对话框。
C#模式窗体打开的操作:
OptionForm form = new OptionForm();
//form.ShowDialog();
form.ShowDialog(this);
- 1.
- 2.
- 3.
- 4.
- 5.
对于指定所有者方式打开的模式窗体可以在模式窗体内部获取主窗体的引用,
//在模式窗体内部访问所属窗体
MainForm form = this.Owner as MainForm;
- 1.
- 2.
- 3.
注意,如果以Form.ShowDialog ()方式打开,那Form.Owner属性会是空引用。
C#模式窗体的关闭
先来看一下模式窗体关闭后的返回值。无论是调用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 +=
new System.Windows.Forms.
FormClosingEventHandler(
this.OptionForm_FormClosing);
//注册确定按钮事件
this.buttonOK.Click +=
new System.EventHandler(
this.buttonOK_Click);
//注册取消按钮事件
this.buttonCancel.Click +=
new System.EventHandler(
this.buttonCancel_Click);
//三个事件对应的事件处理程序如下,
//确定按钮处理程序
private void buttonOK_Click(
object sender, EventArgs e)
{
//假设textBoxPath用来记录目录路径,如果不存在要求用户重新设置。
if (this.textBoxPath.Text.Trim().Length == 0)
{
MessageBox.Show("输入路径信息不对!");
this.textBoxPath.Focus();
}
else
{
this.DialogResult = DialogResult.OK;
}
}
//取消按钮处理程序
private void buttonCancel_Click(
object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
//窗体关闭处理程序,在关闭窗体时发生。
private void OptionForm_FormClosing(
object sender, FormClosingEventArgs e)
{
if (this.DialogResult != DialogResult.Cancel &&
this.DialogResult != DialogResult.OK)
e.Cancel = true;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
上面的关于C#模式窗体关闭的代码都正常,就是事件写多了,对上面代码进行修改,去掉[取消]按钮事件和窗体关闭事件以及相关的事件处理程序。首先需要在窗体构造函数中通过设置按钮的DialogResult属性来实现返回特定的DialogResult。
this.buttonOK.DialogResult =
System.Windows.Forms.DialogResult.OK;
this.buttonCancel.DialogResult =
System.Windows.Forms.DialogResult.Cancel;
//注册确定按钮事件
this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click);
//确定按钮处理程序
private void buttonOK_Click(object sender, EventArgs e)
{
if (this.textBoxPath.Text.Trim().Length == 0)
{
MessageBox.Show("输入的路径信息不对!");
this.textBoxPath.Focus();
//设置文本框焦点
this.DialogResult = DialogResult.None;
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
可见,新的实现方式代码减少了一半。
.Net Framework提供的C#模式窗体
.net Framework为我们提供了一些比较常用的对话框,在开发过程中省了不少事,以下对其进行介绍。
MessageBox。显示可包含文本、按钮和符号(通知并指示用户)的消息框。通过MessageBox.Show 静态方法来打开模式对话框。
public static DialogResult Show ( string text );
- 1.
该方法包含多个重载版本。复杂的一个方法如下,
public static DialogResult Show (
IWin32Window owner,
string text,
string caption,
MessageBoxButtons buttons,
MessageBoxIcon icon,
MessageBoxDefaultButton defaultButton,
MessageBoxOptions options,
string helpFilePath,
HelpNavigator navigator,
Object param ) ;
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
根据不同的参数可以定制对话框的行为。
C#模式窗体的另外一些对话框提供了特定功能。
OpenFileDialog。打开文件对话框,从FileDialog类继承,提示用户打开文件,无法继承此类。对于文件的打开操作属于比较常见的。
SaveFileDialog。保存文件对话框,从FileDialog类继承,提示用户选择文件的保存位置。无法继承此类。
FolderBrowserDialog。目录浏览对话框,从CommonDialog类继承,提示用户选择文件夹。无法继承此类。 FontDialog。字体设置对话框,从CommonDialog类继承,提示用户从本地计算机上安装的字体中选择一种字体。可继承该类。
ColorDialog。颜色设置对话框,从CommonDialog类继承,表示一个通用对话框,该对话框显示可用的颜色以及允许用户定义自定义颜色的控件。可继承该类。
PageSetupDialog。打印页面设置对话框,从CommonDialog类继承,允许用户更改与页面相关的打印设置,包括边距和纸张方向。无法继承此类。
PrintDialog。打印对话框,从CommonDialog类继承,允许用户选择一台打印机并选择文档中要打印的部分。无法继承此类。
PrintPreviewDialog。打印预览对话框,从Form类继承,表示包含 PrintPreviewControl 的对话框窗体。可继承该类。由于该类从Form类继承,所以除了通过
PrintPreviewDialog.ShowDialog ();
PrintPreviewDialog.ShowDialog (IWin32Window);
- 1.
- 2.
- 3.
方法以模式方式打开窗体外,还可以通过PrintPreviewDialog.Show ();
或其重载PrintPreviewDialog.Show (IWin32Window);方法按正常非模式方式打开。
上面列举的文件对话框抽象基类FileDialog是从CommonDialog抽象类继承,因此所有从该类继承的对话框都可以通过CommonDialog.ShowDialog ();或其重载CommonDialog.ShowDialog (IWin32Window);方法以模式方式打开窗体。
C#模式窗体的打开与关闭以及相关的一些操作的介绍就讲解到这里,希望对你了解和学习C#模式窗体有所帮助。