在Application.Run(form1)执行时如何隐藏form1?

时间:2010-12-04 12:13:06

标签: c# .net winforms forms


我有一个与Application.Run一起运行的form1。

我想隐藏这个表单(我需要隐藏它,因为我在后台运行一些东西,所以它们必须执行)并打开另一个表单进行登录。

我尝试这种方式的方法是在我的form1构造函数中执行命令this.Hide();,如果登录成功,则显示我的form1,但它似乎不起作用。有什么想法吗?

7 个答案:

答案 0 :(得分:8)

只需覆盖OnVisibleChanged方法并在其中更改表单的可见性,如下所示:

protected override void OnVisibleChanged(EventArgs e)
{
    base.OnVisibleChanged(e);
    this.Visible = false;
}

就是这样!简单干净。

答案 1 :(得分:2)

请参阅:Use the ApplicationContext Class to Fully Encapsulate Splash Screen Functionality

它基本上讨论了如何首先显示启动表单,然后在完成加载后,如何调用主表单。 (如果您在后台执行某些操作时隐藏主窗体,请考虑启动画面)

  

引言来自简介:这不是关于如何创建的示例   适合您应用的启动画面。这个   文章解释了一个干净的方法   封装闪屏   功能转换为继承   ApplicationContext类。本文   还详细说明了会发生什么   在WinForm应用程序的幕后   启动。

答案 2 :(得分:2)

您可以覆盖Form1类中的SetVisibleCore,以便在启动时隐藏Form1实例。所以这里有一个隐藏隐藏表单的示例,当然你应该添加一些逻辑来决定何时实际允许表单可见。

public partial class Form1 : Form 
{ 
  public Form1() 
  { 
    InitializeComponent(); 
  } 

  protected override void SetVisibleCore(bool value) 
  {       
    // Quick and dirty to keep the main window invisible
    // you can put some logic here to decide when to use the
    // incomming value and when to force it to be false as I 
    // am showing here.       
    base.SetVisibleCore(false); 
  } 
} 

这是一个简单的例子,虽然是人为的。 Form1开始不可见并显示Form2,当Form2关闭时,它允许Form1变为可见并显示表单。

using System;
using System.Windows.Forms;

namespace HideMainWinForm
{
  public partial class Form1 : Form
  {
    // Initially the main form cannot show
    private bool _canShow = false; 

    public Form1()
    {
      InitializeComponent();

      Form2 frm = new Form2();
      frm.FormClosed += new FormClosedEventHandler(frm_FormClosed);
      frm.Show();      
    }

    void frm_FormClosed(object sender, FormClosedEventArgs e)
    {
      // Once Form2 is closed we now allow the main form to
      // become visible.
      _canShow = true;
      this.Show();
    }

    protected override void SetVisibleCore(bool value)
    {
      base.SetVisibleCore(_canShow && value);
    }
  }
}

答案 3 :(得分:0)

如果您需要在展示表单之前做一些后台工作,我会建议两种可能的选择。

第一个,就是在创建表单之前完成后台工作,并在其上调用Application.Run

第二个选项,如果您需要在执行后台工作时激活消息循环,则使用Application.Run重载,该重载不会将From作为参数,稍后会准确显示您的Form当你想要的时候。唯一的问题是,当您想要结束应用程序时,您必须手动调用Application.ExitApplication.ExitThread(因为它没有可以观看其关闭事件的表单)。

所以你的代码看起来像这样:

void Main()
{
    // trigger some background work
    ...

    // and start the message pump
    Application.Run();
}


void SomeBackgroundWork()
{
    // let's say now you completed the background work and you want to show your main Form
    MyForm f = new MyForm();
    f.Close += delegate { Application.Exit(); };
    f.Show();
}

如果需要澄清,请发表评论......

答案 4 :(得分:0)

问题如下:

通过在实际设置this.Hide()的构造函数中调用this.Visible = false,但在表单实例化之后立即调用form.Show(由Application.Run)并在内部设置form.Show this.Visible = true(当然,这与Hide相反......)。

你可以这样做:

private bool firstShow = true;

protected override void OnShown(EventArgs e)
{
    if (firstShow)
    {
        this.Hide();
        firstShow = false;
        return;
    }
    base.OnShown(e);
}

表格会出现片刻,然后会立即消失。

布尔标志firstShow允许您仅为第一次调用Show()隐藏表单,而对于以下调用,它将照常工作。

答案 5 :(得分:0)

Windows窗体有一个适合这个名为Form.Shown的事件。首次显示表单时,每个Form对象只调用一次。基本上它是digEmAll的答案,但已经内置。

将事件处理程序添加到由Form1.Shown调用的构造函数中,然后在名为Hide()的hanlder中添加

public form1()
{
    InitializeComponent()
    this.Shown += new EventHandler(form1_Shown);
    // call splash page
}

void form1_Shown(object sender, EventArgs e)
{
    this.Hide()
}

答案 6 :(得分:0)

您可以使用这种方式。但是,您必须注意使用await和async的方法。

protected override void OnVisibleChanged(EventArgs e){
    base.OnVisibleChanged(e);
    this.Visible = false;
}

使用(等待和异步)的方法的初始化形式中必须带有(结果)一词。

示例:

public frmForm1() {
    InitializeComponent();
    try {
        if (Program.LaunchedViaStartup == true) {
            var varclsReturnBack = funcStartBackGroundObjectsAsync().Result;
        }
    } catch (Exception varException) {
        Console.Write(varException.Message);
    }
}