【问题标题】:How to hide a stack of modal forms in .NET Windows Forms如何在 .NET Windows 窗体中隐藏一堆模式窗体
【发布时间】:2013-12-07 19:11:36
【问题描述】:

我有以下问题:

我在一个堆栈中打开多个模态表单(例如,form1 打开模态表单 form2,而后者又打开模态表单 form3,等等)。我想隐藏整个堆栈。

我尝试调用 Hide 方法或在父级上设置 Visible 属性,但这只会隐藏父级。我还尝试单独隐藏每个表单,但随后我必须在每个表单上调用 ShowDialog 来锁定我调用上述方法的线程。

有没有办法设置模态对话框,以便它们继承父级的状态并通过在第一个表单上设置属性隐藏在级联中?

我也愿意接受其他建议。

【问题讨论】:

  • 模式对话框的意思是:“请在继续之前立即做一些事情”。将模态表单置于模态表单之上,然后只想隐藏它们意味着您并没有真正按照预期的方式使用模态表单。考虑修改您的 gui 界面。
  • 不幸的是,无法通过重新设计 GUI 来解决此问题。即使有可能,我认为当前的设计是有效的,因为在某些情况下表单可能具有复杂的功能。因此,如果请求用户注意的表单具有足够复杂的逻辑,则也可能需要锁定锁定其父级的表单。此外,业务流程的三个深度级别对于业务应用程序来说似乎是完全可以接受的。

标签: c# .net winforms modal-dialog showmodaldialog


【解决方案1】:

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

ShowDialog 启动消息循环,这将导致混乱,因为对话框已经在运行消息循环。

【讨论】:

    【解决方案2】:

    由于您在谈论模态对话框,因此它将是最后一个打开的会开始此操作的对话框。如下例所示打开每个表单,然后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();
        }
    }
    

    【讨论】:

    • 这是级联 Hide 方法调用的一个非常好的示例,但我更喜欢 Ben 的解决方案,因为我将 Visible 属性设置为表单列表比修改应用程序的整个架构更容易.
    • @Bogdan 没问题。不要忘记Dispose ShowDialog 表格。 (见msdn.microsoft.com/en-us/library/c7ykbedk.aspx
    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多