2009-04-30 59 views
22

我在载入事件期间将窗体的可见性更改为false,并且窗体仍然显示它自己。什么是正确的事件,以配合this.Visible = false;至?我想实例化Form1而不显示它。C#/ .net - WinForms - 实例化一个窗体而不显示它

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

    } 
} 
+4

我很困惑有多少人在这个线程中给出了答案,但没有检查结果。隐藏(); Visible = false;在这种情况下,这些东西都不起作用。它不像其他形式,它的主要形式,无论你做什么,它都会显示出来。这里的人们在给出虚假答案之前需要思考。顺便说一下,Visual Studio 2010中的Main Form没有Visible属性。它根本就不存在。 – 2011-02-13 17:59:22

+0

@Draek,好点。但是,您可以使用名为ShowInTaskbar和WindowState的属性组合来实现类似的功能。我将其添加为答案。 – 2012-02-08 07:49:13

回答

22

无论您在表单显示之前您尝试设置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实例(将自动为您创建“油烟机“)。相应缩短代码。

2

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

0

有你的form_loadform_activated事件

+0

仅供参考,在form_load事件中使用时不起作用,但在form_activated事件中起作用,尽管在隐藏之前显示了分秒的表单。 – CraigTP 2009-04-30 14:06:02

1

上VisibleChanged事件尝试尝试

this.Hide(); 

+0

我会尽力的。 – BuddyJoe 2009-04-30 14:48:27

1

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

+0

我想也许你的意思是隐藏而不是实例化,对吗?在任何情况下(不是双关语),你必须确保无论你在哪里调用它,都会发生在表单可见的调用之后,但在它实际成为可见之前发生。 – 2009-04-30 13:56:11

+0

其实我提出了一个方法来初始化显示表单之前的任何必要的东西。 – 2009-04-30 14:01:58

+0

试过了。这没有用。 – BuddyJoe 2009-04-30 14:48:52

0

设置构造器的公开程度,在init之后再this.Show()后

1

所显示的事件可能给你想要你想要的。虽然表格在隐藏之前会“闪现”一秒钟。

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

的InitializeComponent()被设置THIS.VISIBLE = TRUE,因为你指定的形式应该是在设计师可见的(或者默认为是)。您应该在设计器中将Visible设置为false,并且不会被InitializeComponent()调用。然后,您可以随时将其显示出来。

0

Load事件有.Visible = falseHide()会导致您的形式简要介绍,因为是当它变成实际可见之间时间的Load事件被炒鱿鱼,尽管事实是,文件说的相反。

你打电话给Show()还是ShowDialog()?我不确定这种行为是否仍然存在,但至少在框架的过去版本中,调用ShowDialog()并未触发Load事件,所以也许这就是您的问题(尽管我认为调用ShowDialog()然后隐藏了模式表单会是一个不好的做法!)

如果你不得不为你想要做的任何事情创建句柄(和控制手柄),更好的办法是将StartLocation设置为Manual,然后设置将Position属性移至屏幕外位置。这将创建并显示表单,同时使其对用户不可见。

1

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

我无法找到一个合适的位置来阻止正在运行的主表单至少快速显示。即使在加载事件中激活的计时器也不会这样做。

如果它是一个辅助形式,只是创建它,但不显示它。

0

是的,对于代码来说,真正的一种优雅方式比你的应用程序视觉效果隐藏在构造函数/加载事件中来闪烁窗体。

10

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

在属性窗口中将名为WindowState的属性设置为最小化并将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的

11

我知道这是一个老问题,但我只是偶然发现了它,我很惊讶,没有人提到SetVisibleCore

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

在该代码片段中,只要isVisibleCore保持为假,表单将保持不可见状态。如果在表单被实例化时设置为false,那么如果您在Shown事件中设置了Visible = false,则不会获得您获得的简短可见性。

2

如何在设计时将不透明度属性设置为0,并在要显示表单时将其设置为100?

2

我可以与 住在一起的解决方案,因此创建窗体并在创建时调用on_load。 集的WindowState最小化,然后负载设置为false的WindowState可见正常

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

什么也没有奏效:

的SetVisibleCore清除溶液没有创建的形式

成也

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

):

1

对于无闪烁的显示的解决方案,关屏负载时,也设置窗体的位置:

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; 
} 
0

我同意,这可真让人郁闷,因为通常的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();  
    } 
} 
相关问题