2012-02-02 49 views
1

我有以下问题:如何隐藏在.NET中的Windows模式表格纸叠窗体

我在堆栈中打开多个模式的形式(例如,Form1中打开这反过来又打开模式窗体模式窗体窗口2 form3等)。我想隐藏整个堆栈。

我尝试调用Hide方法或在父级上设置Visible属性,但这只隐藏父级。我也尝试过单独隐藏每一个表单,但是之后我必须在每个表单上调用ShowDialog来锁定我称之为前述方法的线程。

是否有方法来设置模式对话框,以便它们继承父级的状态并通过在第一个窗体上设置属性而隐藏在级联中?

我也接受其他建议。

+4

模态对话意味着:“请在继续之前先做一些事情”。模态形式超过模态形式,然后想要隐藏它们意味着你不是*真正*使用模式形式的方式。考虑修改你的GUI界面。 – LarsTech 2012-02-02 16:26:14

+0

不幸的是,通过重新设计GUI来解决问题不是一种选择。即使有可能,我认为当前的设计是有效的,因为可能会出现表单可能具有复杂功能的情况。因此,如果请求用户注意的表单具有足够复杂的逻辑,则可能会出现锁定锁定其父项的表单的需要。此外,业务流程的三个深度对于业务应用程序来说似乎是可以接受的。 – Bogdan 2012-02-02 18:05:08

回答

1

要通过设置obj.Visible = false只需设置而不是ShowDialog来重新显示您隐藏的表单。

ShowDialog启动一个消息循环,由于对话框已经在运行消息循环,所以会引起混乱。

1

由于您在谈论模态对话框,它将是最后一个将开始此操作的对话框。按照以下示例打开每个窗体,然后打开最后一个窗体的Hide()

public partial class Form1 : Form 
{ 
    Form2 frm2 = new Form2(); 

    public Form1() 
    { 
     InitializeComponent(); 
     frm2.VisibleChanged += frm2_VisibleChanged; 
     Shown += Form1_Shown; 
    } 

    void Form1_Shown(object sender, EventArgs e) 
    { 
     frm2.ShowDialog(); 
    } 

    void frm2_VisibleChanged(object sender, EventArgs e) 
    { 
     if (frm2.Visible == false) Hide(); 
    } 
} 
+0

这是级联Hide方法调用的一个很好的例子,但我更喜欢Ben的解决方案,因为我更容易将Visible属性设置为表单列表,而不是修改我的应用程序的整个体系结构。 – Bogdan 2012-02-03 09:58:50

+0

@Bogdan没问题。别忘了'处理'ShowDialog表单。 (请参阅http://msdn.microsoft.com/en-us/library/c7ykbedk.aspx) – ispiro 2012-02-03 13:15:01

相关问题