我有一个与Application.Run
一起运行的form1。
我想隐藏这个表单(我需要隐藏它,因为我在后台运行一些东西,所以它们必须执行)并打开另一个表单进行登录。
我尝试这种方式的方法是在我的form1构造函数中执行命令this.Hide();
,如果登录成功,则显示我的form1,但它似乎不起作用。有什么想法吗?
答案 0 :(得分:8)
只需覆盖OnVisibleChanged方法并在其中更改表单的可见性,如下所示:
protected override void OnVisibleChanged(EventArgs e)
{
base.OnVisibleChanged(e);
this.Visible = false;
}
就是这样!简单干净。
答案 1 :(得分:2)
请参阅:Use the ApplicationContext Class to Fully Encapsulate Splash Screen Functionality
它基本上讨论了如何首先显示启动表单,然后在完成加载后,如何调用主表单。 (如果您在后台执行某些操作时隐藏主窗体,请考虑启动画面)
引言来自简介:这不是关于如何创建的示例 适合您应用的启动画面。这个 文章解释了一个干净的方法 封装闪屏 功能转换为继承 ApplicationContext类。本文 还详细说明了会发生什么 在WinForm应用程序的幕后 启动。
答案 2 :(得分:2)
您可以覆盖Form1类中的SetVisibleCore,以便在启动时隐藏Form1实例。所以这里有一个隐藏隐藏表单的示例,当然你应该添加一些逻辑来决定何时实际允许表单可见。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override void SetVisibleCore(bool value)
{
// Quick and dirty to keep the main window invisible
// you can put some logic here to decide when to use the
// incomming value and when to force it to be false as I
// am showing here.
base.SetVisibleCore(false);
}
}
这是一个简单的例子,虽然是人为的。 Form1开始不可见并显示Form2,当Form2关闭时,它允许Form1变为可见并显示表单。
using System;
using System.Windows.Forms;
namespace HideMainWinForm
{
public partial class Form1 : Form
{
// Initially the main form cannot show
private bool _canShow = false;
public Form1()
{
InitializeComponent();
Form2 frm = new Form2();
frm.FormClosed += new FormClosedEventHandler(frm_FormClosed);
frm.Show();
}
void frm_FormClosed(object sender, FormClosedEventArgs e)
{
// Once Form2 is closed we now allow the main form to
// become visible.
_canShow = true;
this.Show();
}
protected override void SetVisibleCore(bool value)
{
base.SetVisibleCore(_canShow && value);
}
}
}
答案 3 :(得分:0)
如果您需要在展示表单之前做一些后台工作,我会建议两种可能的选择。
第一个,就是在创建表单之前完成后台工作,并在其上调用Application.Run
。
第二个选项,如果您需要在执行后台工作时激活消息循环,则使用Application.Run
重载,该重载不会将From作为参数,稍后会准确显示您的Form当你想要的时候。唯一的问题是,当您想要结束应用程序时,您必须手动调用Application.Exit
或Application.ExitThread
(因为它没有可以观看其关闭事件的表单)。
所以你的代码看起来像这样:
void Main()
{
// trigger some background work
...
// and start the message pump
Application.Run();
}
void SomeBackgroundWork()
{
// let's say now you completed the background work and you want to show your main Form
MyForm f = new MyForm();
f.Close += delegate { Application.Exit(); };
f.Show();
}
如果需要澄清,请发表评论......
答案 4 :(得分:0)
问题如下:
通过在实际设置this.Hide()
的构造函数中调用this.Visible = false
,但在表单实例化之后立即调用form.Show(由Application.Run
)并在内部设置form.Show
this.Visible = true
(当然,这与Hide相反......)。
你可以这样做:
private bool firstShow = true;
protected override void OnShown(EventArgs e)
{
if (firstShow)
{
this.Hide();
firstShow = false;
return;
}
base.OnShown(e);
}
表格会出现片刻,然后会立即消失。
布尔标志firstShow
允许您仅为第一次调用Show()
隐藏表单,而对于以下调用,它将照常工作。
答案 5 :(得分:0)
Windows窗体有一个适合这个名为Form.Shown
的事件。首次显示表单时,每个Form对象只调用一次。基本上它是digEmAll的答案,但已经内置。
将事件处理程序添加到由Form1.Shown
调用的构造函数中,然后在名为Hide()
的hanlder中添加
public form1()
{
InitializeComponent()
this.Shown += new EventHandler(form1_Shown);
// call splash page
}
void form1_Shown(object sender, EventArgs e)
{
this.Hide()
}
答案 6 :(得分:0)
您可以使用这种方式。但是,您必须注意使用await和async的方法。
protected override void OnVisibleChanged(EventArgs e){
base.OnVisibleChanged(e);
this.Visible = false;
}
使用(等待和异步)的方法的初始化形式中必须带有(结果)一词。
示例:
public frmForm1() {
InitializeComponent();
try {
if (Program.LaunchedViaStartup == true) {
var varclsReturnBack = funcStartBackGroundObjectsAsync().Result;
}
} catch (Exception varException) {
Console.Write(varException.Message);
}
}