模态对话框与无模态对话框
本文关键字:模态 对话框 | 更新日期: 2023-09-27 18:27:33
我有两种形式,即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");
它运行良好,但这是实现这一目标的唯一途径吗?
不,这不是唯一的方法。第一个表单将为第二个表单的FormClosed
或FormClosing
公共事件附加一个处理程序。
当您的第二个表单关闭时,它将引发事件,第一个表单将知道您的第二表已关闭。
只需使用以下片段:
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.");
}
使用事件处理程序
var two = new Two();
two.Closed += OnTwoClosed;
two.Show();
private void OnTwoClosed(object sender, EventArgs e)
{
MessageBox.Show("Two Closed")
}
尚未在winforms Form
上测试过此代码,但主体是相同的,并且比使用具有所有固有缺陷的Windows API更容易。
另一个好处是,窗口的标题可以是你喜欢的任何内容。
在此处检查后,似乎Closed
和FormClosed
都是有效事件。
这看起来很乱。不确定你想在这里实现什么。只需在One的事件处理程序中打开表单二,并将二的onclose事件挂接到MessageBox。