C#/。NET – WinForms – 实例化一个表单而不显示它

我在加载事件期间将表单的可见性更改为false,表单仍然显示自己。 什么是正确的事件来绑定这个.Visible = false; 至? 我想实例化Form1而不显示它。

using System; using System.Windows.Forms; namespace TestClient { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.Visible = false; } } } 

无论您在显示表单之前尝试设置Visible属性多少,它都会弹出。 据我了解,这是因为它是当前ApplicationContext的MainForm。 使表单自动加载但在应用程序启动时不显示的一种方法是更改​​Main方法。 默认情况下,它看起来像这样(.NET 2.0 VS2005):

 [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } 

如果您改为执行此类操作,应用程序将启动,加载表单并运行,但表单不会显示:

 [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Form1 f = new Form1(); Application.Run(); } 

我不完全确定这有用,但我希望你知道; o)

更新:似乎您不需要将Visible属性设置为false,或者提供ApplicationContext实例(将在“引擎盖下”为您自动创建)。 相应地缩短了代码。

我知道这是一个古老的问题,但我偶然发现它并且很惊讶没人提到SetVisibleCore

 bool isVisibleCore = false; protected override void SetVisibleCore(bool value) { base.SetVisibleCore(isVisibleCore); } 

在该代码段中,只要isVisibleCore保持为false,表单将保持不可见。 如果在实例化表单时将其设置为false,则在“已显示”事件中设置Visible = false时,您将无法获得短暂的可见性闪烁。

我花了一些时间找到一个正常工作的解决方案。

在属性窗口下将名为WindowState的属性设置为Minimized,将ShowInTaskbar设置为False。 填写完表单后,请调用下面的代码行。

  this.ShowInTaskbar = true; this.WindowState = System.Windows.Forms.FormWindowState.Maximized; //this.WindowState = System.Windows.Forms.FormWindowState.Normal; 

PS:此解决方案在Visual C#2008 Express Edition上进行了测试

只需创建Form1的实例,不要调用方法来显示/显示它。 但我敢打赌你做错了什么。

如何在设计时将Opacity属性设置为0,如果要显示表单,则将其设置为100?

我可以使用的解决方案,以便创建表单并在创建时调用on_load。 设置WindowState以最小化然后将负载集可见为false并将windowstate设置为normal

 private void Form1_Load(object sender, EventArgs e) { this.Visible = false; this.WindowState = FormWindowState.Normal; } 

没用的东西:

SetVisibleCore覆盖解决方案没有创建表单

同样的

 Application { Form1 f = new Form1(); Application.Run(); 

):

试试VisibleChanged事件。

显示的事件可能会让您想要。 虽然表单在隐藏之前会“闪烁”一秒钟。

 private void Form1_Shown(object sender, EventArgs e) { this.Visible = false; } 

我建议的是在IntializeComponent()调用之后在_Show事件之前的事件中实例化表单,例如构造函数。

如果这是您的主要forms,那么可能没有比Shown事件更好的地方。 但在这种情况下你会得到闪烁。

我找不到一个停止正在运行的主表单至少快速显示的好地方。 即使在加载事件中激活的计时器也不会这样做。

如果它是辅助表单,只需创建它但不显示它。

对于无闪烁的已显示解决方案,还要在加载期间将窗体的位置设置为屏幕外:

 private Point startuplocation; private void Form1_Load(object sender, EventArgs e) { this.startuplocation = this.Location; this.Location = new Point(-1000, -1000); } private void Form1_Shown(object sender, EventArgs e) //fires first time shown { this.Visible = false; this.Location = this.startuplocation; } 

你有没有尝试过

 this.Hide(); 

form_loadform_activated事件中

在init之后设置构造函数的visibilty,然后在this.Show()之后设置

InitializeComponent()设置this.Visible = true,因为您指定表单应该在设计器中可见(或者默认为该表单)。 您应该在设计器中将Visible设置为false,并且InitializeComponent()不会调用它。 然后,您可以随时将其显示。

Load事件中使用.Visible = falseHide()将导致您的表单短暂显示,因为在物理可见和Load事件被触发之间有时间,尽管文档说明相反。

你在某个地方调用Show()ShowDialog()吗? 我不确定这种行为是否仍然存在,但至少在框架的过去版本中,对ShowDialog()的调用没有触发Load事件,所以也许这是你的问题(尽管我认为调用ShowDialog()然后隐藏模态forms将是一种不好的做法!)

如果你必须为你正在尝试的任何东西创建句柄(和控件的句柄),更好的办法是将StartLocation设置为Manual ,然后将Position属性设置为offscreen位置。 这将创建并显示表单,同时使其对用户不可见。

是的,与您的应用程序相比,对代码的透视真正优雅的方式是通过隐藏在构造函数/ load事件中来闪烁表单。

我同意这可能真的令人抓狂,因为Winforms在初始化一堆控件或填充大型DataGridView或其他任何东西时通常看起来并不漂亮。 仍然需要窗口句柄才能存在,然后才能创建所有已提到的问题。

这里有一些对我有用的东西,你有两个选择:你可以隐藏你的主表单,直到它准备好,或者你可以显示某种小的闪屏让你的用户知道你正在处理它。 请享用。

 public partial class MainForm : Form { public MainForm() { InitializeComponent(); } Size mDeferredSize; protected override void OnHandleCreated(EventArgs e) { // Capture the "real" size... mDeferredSize = Size; // and set it to nothing... Size = new Size(0, 0); DoSomeUglyInitialization(showOptionalSplash: true); Size = mDeferredSize; // ...and now put it back to the original size base.OnHandleCreated(e); } private void DoSomeUglyInitialization(bool showOptionalSplash) { MySplash splash = null; if (showOptionalSplash) { // We have made some borderless form class with a logo or something... splash = new MySplash(); splash.Show(); } // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv // Initialization that REQUIRES A HANDLE, e,g, // we might be creating a bunch of controls, or // populating a big DataGridView. Whatever it is, // we don't want everyone looking at our biz. System.Threading.Thread.Sleep(2500); // (Here simulated...) // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ splash?.Dispose(); } } 

我为表单设置了以下三个属性设置:

 ShowInTaskbar = false ShowIcon = false WindowState = Minimized