C#:显示一个不可见的形式

时间:2011-03-02 13:40:58

标签: c# forms

我在C#中有以下代码:

Form f = new MyForm();
f.Visible = false;
f.Show();
f.Close();

尽管f.Visible = false,我看到表格的闪光然后消失了。我需要做些什么才能使这个表格不可见?

我需要在应用程序启动期间显示表单(隐形),因为这样做会在显示此表单时消除冷启动延迟。

5 个答案:

答案 0 :(得分:15)

如果您想在没有实际看到的情况下显示表单,可以执行以下操作:

  public Form1()
  {
     InitializeComponent();
     this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
     this.ShowInTaskbar = false;
     this.Load += new EventHandler(Form1_Load);
  }

  void Form1_Load(object sender, EventArgs e)
  {
     this.Size = new Size(0, 0);
  }

如果稍后您要展示它,您可以更改所有内容。以下是10秒后的示例,它显示以下形式:

  Timer tmr = new Timer();
  public Form1()
  {
     tmr.Interval = 10000;
     tmr.Tick += new EventHandler(tmr_Tick);
     tmr.Start();

     InitializeComponent();
     this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
     this.ShowInTaskbar = false;
     this.Load += new EventHandler(Form1_Load);
  }

  void tmr_Tick(object sender, EventArgs e)
  {
     this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
     this.ShowInTaskbar = true;
     this.Size = new Size(300, 300);
  }

  void Form1_Load(object sender, EventArgs e)
  {
     this.Size = new Size(0, 0);
  }

答案 1 :(得分:11)

到目前为止,保持表单不可见的最简单方法就是不显示它。在Winforms中这是一个大问题,调用Show()或将Visible属性设置为true(同样的事情)做 lot 的事情。这是创建本机Windows窗口的方式。在典型的.NET'懒惰'时尚。任何将Visible设置为false的尝试(如在OnLoad中)都将被击败。

从技术上讲,你可以覆盖SetVisibleCore()方法。像这样:

    protected override void SetVisibleCore(bool value) {
        if (!this.IsHandleCreated) {
            this.CreateHandle();
            value = false;   // Prevent window from becoming visible
        }
        base.SetVisibleCore(value);
    }

这可以确保在调用Show()的第一次时间内窗口不可见。例如,当您使用NotifyIcon时,这通常很方便,您通常希望图标直接位于通知区域中,并且仅在用户单击图标时显示一个窗口。请注意,OnLoad()在窗口实际可见之前不会运行,因此请将代码移至构造函数或覆盖(如果需要)。

答案 2 :(得分:9)

只是因为f.Show()正在使表单再次显示为f.Close()正在关闭它...所以闪存。

如果您看到MSDN doc for Form.Show()方法,则会明确提及:

  

显示控件等效,将可见属性设置为 true 。调用Show方法后,Visible属性返回值true,直到调用Hide方法。

<小时/> 如果您不想要闪光灯,则根本不显示表格。

答案 3 :(得分:4)

您需要编辑MyForm类,并添加以下覆盖方法:

protected override void SetVisibleCore(bool value)
{
    //just override here, make sure that the form will never become visible
    if (!IsHandleCreated) CreateHandle();
    value = false;
    base.SetVisibleCore(value);
}

你应该问自己这是否真的有必要 - 可能表明设计很糟糕。

修改: 你需要这样做是非常罕见的,我使用它的唯一情况是当我需要一个表单时我可以放置一个COM组件(因为COM组件需要一个Window句柄),我不得不运行Application.Run (formInstance)调用表单的Show方法。通过强制表单始终不可见,您将获得一个窗口句柄和一个消息循环,而不会在屏幕上看到任何内容。

答案 4 :(得分:0)

我创建了一个帮助方法来显示不可见的形式,随后的SELECT * FROM ( SELECT *, (DATEDIFF(day, Date, CurrentDate)) AS Age FROM Order_Member om INNER JOIN Other_Table ot on om.id = ot.id -- Here )sub WHERE Age > 7 调用将通常显示窗口:

Show

因此表单将被呈现(并且public static class FormHelper { public static void ShowInvisible(this Form form) { // saving original settings bool needToShowInTaskbar = form.ShowInTaskbar; WindowState initialWindowState = form.WindowState; // making form invisible form.ShowInTaskbar = false; form.WindowState = FormWindowState.Minimized; // showing and hiding form form.Show(); form.Hide(); // restoring original settings form.ShowInTaskbar = needToShowInTaskbar; form.WindowState = initialWindowState; } } 事件将触发)而不会闪烁。