【问题标题】:Modal Vs Modeless Dialogs模态与非模态对话框
【发布时间】:2012-03-12 11:17:14
【问题描述】:

我有两种形式,即 OneTwo ,两者的标题文本与它们的名字相同。

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:谢谢............

标签: c# winforms modal-dialog modeless


【解决方案1】:

不,这不是唯一的方法。 您的第一个表单会将处理程序附加到第二个表单的 FormClosedFormClosing 公共事件。

当您的第二个表单关闭时,它将引发事件,第一个表单将知道您的第二个表单已关闭。

只需使用这个 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 看来ClosedFormClosed 都是有效事件。

    【讨论】:

      【解决方案3】:

      这看起来很乱。不知道你想在这里实现什么。只需在 One 的事件处理程序中打开 form 2 并将 two 的 onclose-event 挂钩到您的 MessageBox。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-26
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        相关资源
        最近更新 更多