我有3个表单 - 主表单是Form1,其他表单是表单,然后是登录屏幕。 首先显示启动画面并填充服务器。然后,显示frmAppLogin,用户输入硬编码密码,结果返回到form1。
public Form1()
{
_assembly = Assembly.GetExecutingAssembly();
Stream icon = _assembly.GetManifestResourceStream.....
this.Icon = new Icon(icon);
Thread t = new Thread(new ThreadStart(SplashScreen));
t.Start();
InitializeComponent();
PopulateServers();
//Thread.Sleep(800);
Form frmLogin1 = new frmAppLogin();
t.Abort();
frmLogin1.ShowDialog();
DialogResult res = new DialogResult();
res = frmLogin1.DialogResult;
if (res == DialogResult.OK)
{
_LoggedIn = true;
}
else
{
_LoggedIn = false;
}
}
这是form1_load的代码:
private void Form1_Load(object sender, EventArgs e)
{
if (_LoggedIn)
{
try
{
blah blah........
}
catch
{
MessageBox.Show("Error accessing resources!");
}
}
else
{
this.Close();
}
}
登录表单的代码:
public frmAppLogin()
{
InitializeComponent();
this.WindowState = FormWindowState.Normal;
}
private void btnAppLogin_Click(object sender, EventArgs e)
{
if (txtAppPass.Text.ToString() == requiredPass)
{
this.DialogResult = DialogResult.OK;
this.Close();
}
else
{
txtAppPass.Clear();
txtAppPass.Focus();
MessageBox.Show("Incorrect Password");
}
}
问题是当启动画面消失时,登录表单会弹出一瞬间,但会立即最小化到任务栏。
通过GUI将Startposition设置为CenterScreen和WindowState Normal。
此外,只有当我在调试文件夹,I.E中运行application.exe(或从中复制它)时才会发生这种情况。在Visual Studio 2010中调试时不会发生这种情况。
编辑:只是为了添加它,我也尝试过:
private void frmAppLogin_Load(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Normal;
}
哪个没用。
答案 0 :(得分:3)
我很确定你是在诊断这个错误。对话框没有最小化,它消失在另一个应用程序的窗口后面。通常是Visual Studio,每个人都可以最大化它,因此它非常适合覆盖其他窗口。最小化其他窗口以找回对话框。
这里出现的问题是,一瞬间,您的应用程序没有Windows可以关注的任何窗口。实际上两次,在启动画面和登录表单之间。再次登录表单和主表单之间。 Windows窗口管理器被迫找到另一个要关注的窗口,因为你没有任何候选者,它会选择另一个应用程序的窗口。
窗口管理器允许给应用程序时间来创建它的第一个窗口,这不可避免地需要时间。你的启动画面毫无疑问会弄乱那种逻辑。代码不容易修复发布,调用ShowDialog()后调用代码的标准技巧将无法正常工作,因为您的应用程序还没有引发消息循环。这本身就是一个问题。至少通过修复启动画面开始解决这个问题,.NET已经内置了对它们的坚实支持。回答is here。
答案 1 :(得分:1)
t.Start();
InitializeComponent();
PopulateServers();
Form frmLogin1 = new frmAppLogin();
this.Activate(); //This Line will Solve your problem
t.Abort();
答案 2 :(得分:0)
我知道我回答得太晚了。我得到了同样的问题并阅读了这篇文章并试图找出解决方案。
我创建了一个Timer
对象,并设置了Interval = 10
并在Timer
上启动了Form Load event
。然后在计时器的Tick事件上打开对话框并停止计时器并显示login.showDialog()
。这对我来说可以。请参阅下面的代码。
private Timer dispatcher;
public MainView()
{
InitializeComponent();
frmMdiChildList = new List<Form>();
Load += new EventHandler(MainView_Load);
FormClosing += new FormClosingEventHandler(MainView_FormClosing);
Activated += new EventHandler(MainView_Activated);
}
void MainView_Load(object sender, EventArgs e)
{
dispatcher = new Timer();
dispatcher.Interval = 10; //10 milliseconds
dispatcher.Tick += new EventHandler(dispatcher_Tick);
dispatcher.Start();
}
void dispatcher_Tick(object sender, EventArgs e)
{
dispatcher.Stop();
dispatcher = null;
showLoginForm();
}
private void showLoginForm() {
Form loginForm = new LoginView();
loginForm.ShowDialog();
}
答案 3 :(得分:0)
对于那些会遇到问题的人,会弹出一段时间,但会立即最小化到任务栏,这是一个可能的解决方案:
FormNew f = new FormNew();
f.Owner = this; // - this is the solution line
f.Show();
答案 4 :(得分:0)
我正在开发的程序也遇到了同样的问题。这是我为解决此问题所做的工作。似乎运作良好。
在我的主要形式中,我按照以下步骤设置构造函数和StartForm
方法:
public FrmMain()
{
Thread thread = new Thread(new ThreadStart(StartForm));
thread.Start();
Thread.Sleep(7000);
InitializeComponent();
thread.Abort();
}
private void StartForm()
{
Application.Run(new FrmSplash());
}
然后以我的主要形式,如下设置FrmMain_Load
事件:
private void FrmMain_Load(object sender, EventArgs e)
{
Activate(); // Give focus to FrmMain and maximize window
}
完成!