我有一个应用程序,在其中有一个表单,在Load方法中,我需要隐藏这个表单。
当它需要显示时,这个表单会自行显示(类似于Outlook 2003样式的弹出窗口),但我无法想出如何在加载时隐藏表单而不使代码混乱。
有什么建议吗?
通常,只有在使用托盘图标或其他方法稍后显示窗体时才需要这样做,但即使您从不显示主窗体,它也可以很好地工作。
在您的窗体类中创建一个布尔变量,并将其默认设置为false:
private bool allowshowdisplay = false;
然后覆盖 SetVisibleCore 方法
protected override void SetVisibleCore(bool value)
{
base.SetVisibleCore(allowshowdisplay ? value : allowshowdisplay);
}
因为Application.Run()在加载表单后会将表单的.Visible属性设置为true,因此这会截获该操作并将其设置为false。在上述情况中,它将始终设置为false,直到您通过将allowshowdisplay设置为true来启用它。private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
this.allowshowdisplay = true;
this.Visible = !this.Visible;
}
}
我是从C#的角度来看待这个问题的,但vb.net应该非常相似。
在你的主程序文件中的Main方法中,你会有类似这样的内容:
Application.Run(new MainForm());
这将创建一个新的主窗体,并将应用程序的生命周期限制为主窗体的生命周期。
但是,如果您删除 Application.Run() 的参数,则应用程序将以无窗体显示的方式启动,您可以自由地显示和隐藏窗体。
与其在 Load 方法中隐藏窗体,不如在调用 Application.Run() 之前初始化窗体。我假设该窗体上有一个 NotifyIcon 用于显示任务栏中的图标 - 即使窗体本身尚不可见,也可以显示它。从 NotifyIcon 事件句柄中调用 Form.Show()
或 Form.Hide()
将分别显示和隐藏窗体。
我使用这个:
private void MainForm_Load(object sender, EventArgs e)
{
if (Settings.Instance.HideAtStartup)
{
BeginInvoke(new MethodInvoker(delegate
{
Hide();
}));
}
}
显然,您需要将if条件更改为您自己的条件。
protected override void OnLoad(EventArgs e)
{
Visible = false; // Hide form window.
ShowInTaskbar = false; // Remove from taskbar.
Opacity = 0;
base.OnLoad(e);
}
在表单构建时(设计师、程序主界面或表单构造器,取决于你的目标),
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;
当您需要显示表单时,可能是来自您的NotifyIcon的事件触发,必要时请反转。 if (!this.ShowInTaskbar)
this.ShowInTaskbar = true;
if (this.WindowState == FormWindowState.Minimized)
this.WindowState = FormWindowState.Normal;
连续的显示/隐藏事件可以更简单地使用表单的可见属性或显示/隐藏方法。
protected override void OnLoad(EventArgs e)
{
Visible = false; // Hide form window.
ShowInTaskbar = false; // Remove from taskbar.
Opacity = 0;
base.OnLoad(e);
}
使用以下代码扩展主表单:
using System.Windows.Forms;
namespace HideWindows
{
public class HideForm : Form
{
public HideForm()
{
Opacity = 0;
ShowInTaskbar = false;
}
public new void Show()
{
Opacity = 100;
ShowInTaskbar = true;
Show(this);
}
}
}
例如:
namespace HideWindows
{
public partial class Form1 : HideForm
{
public Form1()
{
InitializeComponent();
}
}
}
这篇文章提供了更多关于隐藏表单的信息:
将以下内容放入Program.cs文件中:
FormName FormName = new FormName ();
FormName.ShowInTaskbar = false;
FormName.Opacity = 0;
FormName.Show();
FormName.Hide();
当您想要显示表单时,请使用此功能:
var principalForm = Application.OpenForms.OfType<FormName>().Single();
principalForm.ShowInTaskbar = true;
principalForm.Opacity = 100;
principalForm.Show();
您需要将窗口状态设置为最小化,并将在任务栏中显示设置为false。然后,在表单加载结束时,将窗口状态设置为最大化,并将在任务栏中显示设置为true。
public frmMain()
{
Program.MainForm = this;
InitializeComponent();
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;
}
private void frmMain_Load(object sender, EventArgs e)
{
//Do heavy things here
//At the end do this
this.WindowState = FormWindowState.Maximized;
this.ShowInTaskbar = true;
}
this.visible=false;
/* to the InitializeComponent() code just before the */
this.Load += new System.EventHandler(this.DebugOnOff_Load);
this.visible=false;
/* to the start of the load event, you get a
simple perfect working solution :) */
private void
DebugOnOff_Load(object sender, EventArgs e)
{
this.Visible = false;
}