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_load
或form_activated
事件中
在init之后设置构造函数的visibilty,然后在this.Show()之后设置
InitializeComponent()设置this.Visible = true,因为您指定表单应该在设计器中可见(或者默认为该表单)。 您应该在设计器中将Visible设置为false,并且InitializeComponent()不会调用它。 然后,您可以随时将其显示。
在Load
事件中使用.Visible = false
或Hide()
将导致您的表单短暂显示,因为在物理可见和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