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

我有一个使用Application.Run运行的form1。

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

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

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

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

就是这样! 简单干净。

您可以覆盖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); } } } 

请参阅: 使用ApplicationContext类完全封装启动画面function

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

引言来自简介: 这不是关于如何为您的应用创建启动画面的示例。 本文介绍了将启动屏幕function封装到inheritance的ApplicationContext类中的简洁方法。 本文还详细说明了WinForm应用程序启动时幕后发生的情况。

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

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

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

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

 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(); } 

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

问题如下:

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

你可以这样做:

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

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

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

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() }