我在加载事件期间将表单的可见性更改为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;
}
}
}
答案 0 :(得分:23)
无论您在显示表单之前尝试设置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实例(将在“引擎盖下”为您自动创建)。相应地缩短了代码。
答案 1 :(得分:11)
我知道这是一个古老的问题,但我偶然发现它并且很惊讶没有人提到SetVisibleCore
:
bool isVisibleCore = false;
protected override void SetVisibleCore(bool value)
{
base.SetVisibleCore(isVisibleCore);
}
在该代码段中,只要isVisibleCore
保持为false,表单将保持不可见。如果在实例化表单时将其设置为false,则在“已显示”事件中设置Visible = false
时,您将无法获得短暂的可见性闪烁。
答案 2 :(得分:10)
花了一些时间才找到一个正常工作的解决方案。
在属性窗口下将名为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上进行了测试
答案 3 :(得分:2)
只需创建Form1
的实例,不要调用方法来显示/显示它。但我敢打赌你做错了什么。
答案 4 :(得分: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();
):
答案 5 :(得分:2)
如果要在设计时将Opacity属性设置为0,如果要显示表单,请将其设置为100?
答案 6 :(得分:1)
尝试VisibleChanged事件。
答案 7 :(得分:1)
我建议在IntializeComponent()调用之后在_Show事件之前的事件中实例化表单,例如构造函数。
答案 8 :(得分:1)
显示的事件可能会让您想要。虽然表单在隐藏之前会“闪烁”一秒钟。
private void Form1_Shown(object sender, EventArgs e)
{
this.Visible = false;
}
答案 9 :(得分:1)
对于无闪烁的已显示解决方案,还要在加载期间将表单的位置设置为屏幕外:
print ("please enter values as check([x,y,z])to find min and max")
def check(iterable):
try:
(iterable) = int(iterable)
except:
print("please Enter number")
else:
print("************************")
it = iter(iterable)
first = next(it) # Raises an exception if the input is empty
minimum = maximum = cumsum = first
n = 1
for x in it:
n += 1
cumsum += x
if x < minimum:
minimum = x
if x > maximum:
maximum = x
return "min:" + str(minimum), "max:" + str(maximum)
答案 10 :(得分:1)
如果这是您的主要表单,那么可能没有比Shown事件更好的地方。但在这种情况下,你会得到闪烁。
我找不到阻止正在运行的主表单至少快速显示的好地方。即使在加载事件中激活的计时器也不会这样做。
如果它是辅助表单,只需创建它但不显示它。
答案 11 :(得分:0)
我为表单设置了这三个属性设置:
ShowInTaskbar = false
ShowIcon = false
WindowState = Minimized
答案 12 :(得分: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();
}
}
答案 13 :(得分:0)
是的,与您的应用程序相比,对代码的透视真实优雅方式是通过隐藏在构造函数/ load事件中来闪烁表单。
答案 14 :(得分:0)
在.Visible = false
事件中使用Hide()
或Load
会导致您的表单暂时显示,因为它在物理可见和Load
事件之间有时间尽管文档说的相反,但是被解雇了。
您是在某个地方呼叫Show()
还是ShowDialog()
?我不确定这种行为是否仍然存在,但至少在框架的过去版本中,对ShowDialog()
的调用没有触发Load
事件,所以也许这是你的问题(尽管我认为调用ShowDialog()
然后隐藏模态表单将是一种不好的做法!)
如果你必须为你正在尝试做的事情创建句柄(和控件的句柄),更好的办法是将StartLocation
设置为Manual
,然后将Position
属性设置为屏幕外位置。这将创建并显示表单,同时使其对用户不可见。
答案 15 :(得分:0)
InitializeComponent()设置this.Visible = true,因为您指定表单应该在设计器中可见(或者默认为该表单)。您应该在设计器中将Visible设置为false,并且InitializeComponent()不会调用它。然后,您可以随时将其显示出来。
答案 16 :(得分:0)
在init之后设置构造函数的可见性,然后在this.Show()之后设置
答案 17 :(得分:0)
你试过吗
this.Hide();
在form_load
或form_activated
个活动中