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

如何将“this.showintaskbar”更改为“form.showDialog()”,同时保持其打开状态?

  •  5
  • Fredou  · 技术社区  · 14 年前

    如果你在一个新的带有两个表单的winform应用程序中运行这段代码(将其放入form1中)

        private void Form1_Load(object sender, EventArgs e)
        {
            Form2 newForm = new Form2();
            Button b = new Button();
            newForm.Controls.Add(b);
            b.Click += new EventHandler(click);
            this.Show();
            newForm.ShowDialog();
    
        }
    
        private void click(object sender, EventArgs e)
        {
            ((Form)((Control)sender).Parent).ShowInTaskbar = false;
        }
    

    然后点击新表单上的按钮(应该是form2),form2将关闭。

    怎么开着?

    4 回复  |  直到 14 年前
        1
  •  4
  •   Hans Passant    14 年前

    这是不可能的。我真的申请了 bug report 在微软的反馈网站上,但他们却向我大发雷霆。

    无可否认,这是一个需要解决的棘手问题,更改属性需要windows窗体从头开始重新创建窗口,因为它由一个样式标志控制。您只能在 CreateWindowEx() 使用dwexStyle参数调用。根据showDialog()方法调用的要求,重新创建窗口很难使其保持模态。

    windows窗体可以绕过许多user32限制。但不是那个。

        2
  •  2
  •   John Knoeller    14 年前

    通过在showDialog()之前将showintaskBar设置为false来保持打开状态;

    private void Form1_Load(object sender, EventArgs e)
    {
        Form2 newForm = new Form2();
        Button b = new Button();
        newForm.Controls.Add(b);
        b.Click += new EventHandler(click);
        this.Show();
    
        // add this line of code...
        newForm.ShowInTaskbar = false; 
    
        newForm.ShowDialog();
    
    }
    
    private void click(object sender, EventArgs e)
    {
        ((Form)((Control)sender).Parent).ShowInTaskbar = false;
    }
    

    或者不要让第二种形式成为模态。这同样有效。

    private void Form1_Load(object sender, EventArgs e)
    {
        Form2 newForm = new Form2();
        Button b = new Button();
        newForm.Controls.Add(b);
        b.Click += new EventHandler(click);
        this.Show();
    
        newForm.Show();
    }
    

    我不知道这里的具体机制,但很明显,更改标志(实际上更改了一个或多个ws-ex-xxx窗口样式)会导致showDialog()的模式泵退出。这反过来又使你(终于!)退出form1_加载,然后您的新窗体超出范围并被销毁。

    因此,您的问题是showDialog()的组合,而且您还没有准备好让showDialog()退出。

    现在一个for的模式不应该首先出现任务栏图标,对于一个应用程序,应该只有一个任务栏图标 全部的 因为当一个模态窗体运行时,主窗体无论如何都是禁用的。当主窗体最小化时,它所拥有的所有模态窗体都将被隐藏,等等。

    因此,如果您真的希望第二个表单是模态的,就不应该让用户能够给它一个任务栏图标。如果使用showDialog()只是测试代码,那么不用担心。当窗体在主应用程序泵上运行时,问题将消失。

        3
  •  0
  •   Tomas Petricek    14 年前

    你的问题我不太清楚。不管怎样, newForm 窗体显示为模式对话框,这意味着它阻止用户在关闭父窗体之前使用父窗体。模态对话框通常有一些按钮自动关闭它们,返回 OK Cancel 到调用窗体(作为 ShowDialog )使用 DialogResult property ,因此,如果为按钮设置了此属性,这可能是单击模式窗体时关闭该窗体的原因。

    如果您希望以允许用户同时使用这两个窗体的方式显示更多窗体,则需要使用无模式对话框。这里是一个 good overview article on MSDN .

        4
  •  0
  •   Fredou    14 年前

    怎样。。。我的…这是一个丑陋的黑客

    这项工作

        private void Form1_Load(object sender, EventArgs e)
        {
            Form2 newForm = new Form2();
            Button b = new Button();
            newForm.Controls.Add(b);
            b.Click += new EventHandler(click);
            newForm.FormClosed += new FormClosedEventHandler(form2_closed);
            newForm.FormClosing += new FormClosingEventHandler(form2_closing);
            this.Show();
            do
            {
              newForm.ShowDialog();
            } while (newForm.IsDisposed == false );               
        }
    
        private void click(object sender, EventArgs e)
        {
            ((Form)((Control)sender).Parent).ShowInTaskbar = !((Form)((Control)sender).Parent).ShowInTaskbar;
        }
    
        private void form2_closed(object sender, FormClosedEventArgs e)
        {
            ((Form)sender).Dispose();
        }
    
        private void form2_closing(object sender, FormClosingEventArgs e)
        {
            if (e.CloseReason == CloseReason.None)
                e.Cancel = true;
        }