模态与非模态对话框
Posted
技术标签:
【中文标题】模态与非模态对话框【英文标题】:Modal Vs Modeless Dialogs 【发布时间】:2012-03-12 11:17:14 【问题描述】:我有两种形式,即 One
和 Two
,两者的标题文本与它们的名字相同。
One
有一个按钮,它的点击事件包含,
Two l_objTwo = new Two();
l_objTwo.Show();
MessageBox.Show("Two Closed");
它会打开Two
,然后会弹出“Two Closed”消息。
我的场景是,Two
应该以Modeless
的方式打开,即我需要One
的控制,同时我需要在Two
关闭后执行一些功能。截至目前,我正在使用类似,
[DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow(String sClassName, String sAppName);
Two l_objTwo = new Two();
l_objTwo.Show();
IntPtr l_objHandle = FindWindow(null, "Two");
while ((int)l_objHandle > 0)
l_objHandle = FindWindow(null, "Two");
Application.DoEvents();
MessageBox.Show("Two Closed");
它工作正常,但这是实现这一目标的唯一方法吗?
【问题讨论】:
@svick & @ Jodrell:谢谢............ 【参考方案1】:不,这不是唯一的方法。
您的第一个表单会将处理程序附加到第二个表单的 FormClosed
或 FormClosing
公共事件。
当您的第二个表单关闭时,它将引发事件,第一个表单将知道您的第二个表单已关闭。
只需使用这个 sn-p:
private void button1_Click(object sender, EventArgs e)
Form2 f = new Form2();
f.FormClosed += new FormClosedEventHandler(FormClosedHandler);
f.Show();
void FormClosedHandler(object sender, FormClosedEventArgs e)
MessageBox.Show("Second form has closed.");
【讨论】:
【参考方案2】:使用事件处理程序
var two = new Two();
two.Closed += OnTwoClosed;
two.Show();
private void OnTwoClosed(object sender, EventArgs e)
MessageBox.Show("Two Closed")
尚未在 winforms Form
上测试此代码,但原理是相同的,并且比使用 Windows API 更容易,因为它具有所有固有的缺陷。
另一个好处是,窗口的标题可以随心所欲。
After checking here 看来Closed
和FormClosed
都是有效事件。
【讨论】:
【参考方案3】:这看起来很乱。不知道你想在这里实现什么。只需在 One 的事件处理程序中打开 form 2 并将 two 的 onclose-event 挂钩到您的 MessageBox。
【讨论】:
以上是关于模态与非模态对话框的主要内容,如果未能解决你的问题,请参考以下文章