时间:2021-05-20
本文实例分析了C#中登录窗体和欢迎窗体关闭方法。分享给大家供大家参考。具体分析如下:
在c#的winform编程中,我们经常会做登录窗体或欢迎窗体,并把他们作为启动窗体。
但是,我们有可能会遇到一些问题。
请看下面的代码:
复制代码 代码如下:private void button1_Click(object sender, EventArgs e)
{
this.Close();
new Form2().Show();
}
这段代码想让form1中的button1在点击后关闭form1,show出form2,但是目的没有达到,form2是show出来了,但仅仅是一闪,便和关闭的form1一同消失了。
这是怎么回事呢?让我们从,Main方法里找答案。这是自动生成的Main方法:
复制代码 代码如下:static void Main()
{
Application.EnableVisualStyles();//启用可视样式
Application.SetCompatibleTextRenderingDefault(false);//将某些控件的UseCompatibleTextRendering设为默认值
Application.Run(new Form1());//这是关键
}
我们看到这一句
复制代码 代码如下:Application.Run(new Form1());
这是什么意思呢?这是要在没有窗体的情况下,在当前线程上开始运行标准应用程序消息循环,并显示这个窗体。
也就是说,要在一个没有窗体的线程上显示一个窗体,使这个线程不结束。
回过来,在button1的点击事件中,我们show出来的form2又是什么情况呢?这个form2是存活在一个新的线程上的,所以这两个窗体才不会相互阻塞。
那么问题来了,为什么把form1关掉,form2也会关掉呢?
原因是,form2所在的线程,是show它的线程的附属线程,在这里就是说,form2的线程属于form1的线程。在form1关闭的时候,form1所在的线程也就结束,连带着,就把他的所有附属线程也都结束掉了,form2所在的线程自然也不例外,所以form2也会随之关闭。
知道了原因,那么我们就来思考解决的方案。Application.Run();好像很牛的样子,我们来试试它行不行。
改变后的button1代码如下:
复制代码 代码如下:private void button1_Click(object sender, EventArgs e)
{
this.Close();
Application.Run(new Form2());
}
可是运行结果是报错
这是怎么回事呢?这是因为在form1所在的线程上已经运行着一个form了,运行着标准应用程序消息循环,所以就不能在这个线程上再开启一个新循环,显示一个新form了。
既然这个线程不能再来个form了,那我们就换个线程试试!最终的button1的点击事件代码如下
复制代码 代码如下:private void button1_Click(object sender, EventArgs e)
{
this.Close();
new System.Threading.Thread(() =>
{
Application.Run(new Form2());
}).Start();
}
希望本文所述对大家的C#程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了C#实现简单的Login窗口。分享给大家供大家参考。具体实现方法如下:C#制作登录窗体,登录成功之后正确的做法是关闭(close)登录窗体,而不是
使用QQ的人知道,QQ的登录界面总能位于其它窗体的最前端,以免被其它窗体所遮挡而无法看到。在C#中也可以轻松的实现这个功能。具体方法如下。选中窗体后,在窗体的属
本文实例讲述了C#中父窗口和子窗口之间控件互操作的方法。分享给大家供大家参考。具体分析如下:很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子
本文实例讲述了C#中载入界面的常用方法。分享给大家供大家参考。具体方法分析如下:方法1.采用事件委托的方法对象:主窗体:FrmMain加载窗体:FrmLoadi
本文实例讲述了C#禁用双击窗体图标关闭窗体的方法。分享给大家供大家参考。具体实现方法如下:[DllImport("user32.dll")]privatesta