【发布时间】:2011-04-14 03:37:04
【问题描述】:
我有问题。我需要在窗口加载时隐藏我的窗口。但是
private void Form1_Load(object sender, EventArgs e)
{
this.Visible = false;
}
不工作。并且属性Visible 保持不变。我错过了什么吗?
【问题讨论】:
我有问题。我需要在窗口加载时隐藏我的窗口。但是
private void Form1_Load(object sender, EventArgs e)
{
this.Visible = false;
}
不工作。并且属性Visible 保持不变。我错过了什么吗?
【问题讨论】:
是的,Visible 属性在 Windows 窗体中很重要,这就是实际创建句柄并导致 OnLoad() 运行的原因。换句话说,窗口在可见之前是不存在的。它会忽略撤消此操作的尝试。
如果您使用 NotifyIcon,希望仍然创建句柄但不使窗口可见是很常见的。您可以通过覆盖 SetVisibleCore 来实现:
protected override void SetVisibleCore(bool value) {
if (!this.IsHandleCreated) {
value = false;
CreateHandle();
}
base.SetVisibleCore(value);
}
请注意,在窗口真正可见之前,OnLoad 仍然不会运行,因此如有必要,请将代码移动到构造函数中。只需在 NotifyIcon 的上下文菜单事件处理程序中调用 Show() 即可使窗口可见。
【讨论】:
您似乎可以使用以下内容:
private void Form1_Load(object sender, EventArgs e)
{
this.Opacity = 0;
this.ShowInTaskbar = false;
}
我刚刚在一个 winforms 应用程序中对其进行了测试,它确实有效。
(也刚刚发现这个:Single Form Hide on Startup)
【讨论】:
使用this.Opacity = 0;
【讨论】:
我认为从表单的 Load 事件中设置可见性并不是一个好主意。相反,我会通过添加一个公共方法来做到这一点:
public void LoadForm(...)
{
// do the all the initializations
}
并调用方法来加载表单。除非您明确显示,否则该表单应该是不可见的:
MyForm instance = new MyForm();
instance.LoadForm(...);
// instance.Show(); or ShowDialog() for dialog form not sure exactly the syntax.
【讨论】:
像这样在 Windows 事件循环中调用:
WindowsFormsSynchronizationContext.Current.Post((obj) => this.Hide(), null);
所以Hide() 将在稍后被调用,从而解决您的问题。
【讨论】:
我相信这是因为窗口在此事件之后才真正存在。执行此操作的最佳位置是在表单之外:
if (x == 1)
{
form1.ShowForm();
}
else
{
// Don't show the form
}
如果您确实需要在表单本身内部执行此操作,那么我认为您需要使用 Activated 事件。
编辑:
你也可以试试:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 myform = new Form1();
if (myform.CheckStuff())
{
Application.Run(myform);
}
}
【讨论】:
this.Opacity = 0;
this.ShowInTaskbar = false;
【讨论】:
在 Shown 事件中调用 Hide(),Hide() 只会将 Visible 设置为 false,并且在显示表单之前 Visible 属性已经为 false...
【讨论】:
使用this.Hide() 隐藏您的窗口。 this.Close() 关闭
【讨论】: