我有个问题。我需要在窗口加载时隐藏我的窗口。但
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(
) 关闭