代码之家  ›  专栏  ›  技术社区  ›  cprcrack

3窗体Show和ShowDialog未按预期工作,错误?

  •  1
  • cprcrack  · 技术社区  · 16 年前

    我使用的是visualstudio2010,C#.net4.0。我有三张表格:表格一,表格二,表格三。

    在Form1中,我有一个打开Form2的按钮:

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f = new Form2();
        f.Show();
    }
    

    在Form2中,我有一个私有Form3变量始终指向同一个Form3:

    private Form3 f = new Form3();
    

    以及一个按钮,将其作为对话框打开:

    private void button1_Click(object sender, EventArgs e)
    {
        f.ShowDialog();
    }
    

    在Form3中,我只有一个隐藏窗体的按钮:

    private void button1_Click(object sender, EventArgs e)
    {
        this.Hide();
    }
    

    问题是,如果Form2在Form1前面,而Form3在Form2前面,当我单击Form3的按钮隐藏它时,它不仅隐藏自己,而且将Form1发送到所有其他窗口的后面。

    只有在Form1的后台有另一个程序的窗口(如Windows资源管理器)时,才会发生这种情况。好像是个虫子。你怎么认为?

    2 回复  |  直到 13 年前
        1
  •  5
  •   Hans Passant    16 年前

    是的,这不能正常工作的设计。对话框将禁用程序显示的所有窗口。所以它是模态的。当您隐藏对话框时,就没有可以获得焦点的窗口了。Windows被迫找到另一个窗口来将焦点交给它。这将是另一个应用程序拥有的窗口。你自己的窗户将隐藏在它后面。

    有更多的副作用,对话框也会关闭。因为所有的窗口都被禁用了,所以用户再也不能回到你的程序了。这都是不足为奇的行为。Bug是一个强有力的词,但是如果它在关闭对话框之前首先重新启用所有窗口,它当然会工作得更好。但是关闭对话框已经是不受欢迎的行为。

    不要为对话框调用Hide()。只需将DialogResult属性设置为DialogResult.取消为了达到完全相同的效果,减去焦点问题。如果要再次显示对话框,则必须将其重置为“无”。那真是个虫子。

        2
  •  1
  •   default locale    13 年前

    根据文件。 Form.Close method Form.ShowDialog 方法。引用:

    关闭时不释放窗体的两个条件是:(1)它是多文档界面(MDI)应用程序的一部分,并且窗体不可见;(2)使用ShowDialog显示窗体。在这些情况下,您将需要手动调用Dispose以将窗体的所有控件标记为垃圾回收。

    因此,也许有一些方法可以将焦点返回到应用程序(例如,通过windowsapi)。但是打电话方便多了 Form.Close

    推荐文章