如何用timer控件控制创建一个新窗体,并且隐藏当前窗体(杂症)

时间:2021-10-01 23:06:36
如题。form1窗体运行10秒后,用timer1控件创建一个新窗体form2,同时隐藏form1窗体。
private void timer1_Tick(object sender, EventArgs e)
        {            
            timer1.Enabled = false; //只触发一次!
            Form2 f2 = new Form2();            
            f2.Show();
            f2.Activate();
            this.Visible=false;
            this.ShowInTaskbar = false;
            this.WindowState = FormWindowState.Minimized;
            this.Hide();
        }
问题出现了。10秒后,form2正常显示出来了,但是form1仍然没有消失。(偶尔会消失~~~~)
为什么我用了这么多隐藏当前窗体的方法和属性,仍然不能隐藏form1窗体呢?有时候会消失form1窗体。
提示:1。我的form2窗体有很多控件和插件,要加载很多东西。但是form2和form1没有任何控件上的关系。
      2。form1窗体加了自定义的paint事件,实现在窗体上显示一个GIF图片。
      3。如果把form2换成只有一个Button控件的窗体时,基本每次都会按照我设计的思路隐藏form1窗体。

请问用什么方法可以实现题目的想法呢?

10 个解决方案

#1


肯定是form1有代码又把自己给鼓捣出来了,找到这个代码(例如所谓自定义Paint),让它首先判断该不该执行原来的鼓捣自己的代码,别总是鼓捣自己。

#2


不过,不知道你为什么这样设计。如果是好的应用,不要这样玄的方式对待用户行为!应该把管理两个窗体的职责交给上级的程序(因为你也说两个窗体没有什么关系)。窗体1只应该抛出一个事件,然后什么都不做。应该是那个创建窗体1的程序监听到事件之后,创建窗体2,然后关闭窗体1。关闭,而尽可能不要隐藏。

#3


引用 2 楼 sp1234 的回复:
不过,不知道你为什么这样设计。如果是好的应用,不要这样玄的方式对待用户行为!应该把管理两个窗体的职责交给上级的程序(因为你也说两个窗体没有什么关系)。窗体1只应该抛出一个事件,然后什么都不做。应该是那个创建窗体1的程序监听到事件之后,创建窗体2,然后关闭窗体1。关闭,而尽可能不要隐藏。
那个form1是Program.cs里加载的第一个窗体。这样是不是就不能关闭form1呢?关闭了form1后就全关了貌似。
O(∩_∩)O谢谢啦。我把form1的自定义paint去掉了,还是不行。是不是还有其他解决方法?
后来没办法了,我就把form2的窗体构造函数加了form1这个参数,然后在form2的load方法里让form1的visible=FALSE;这样就行了。但是可以明显的看出来一个效果:form2都显示完毕以后form1才消失。怎么解决这个问题呢?
求救~~~~~~~~~~~~~~~

#4



timer1.Enabled = false; //只触发一次!
  Form2 f2 = new Form2();   
  f2.Show();
 this.Visible=false;



我觉得这样就可以的没必要加那么多代码

#5



new System.Threading.Thread((System.Threading.ThreadStart)delegate  
{   
    Application.Run(new Form());   
}).Start();   
this.Close


语法糖(1) -- 打开新窗体,关闭当前窗体的最简化方法
http://blog.csdn.net/wuyazhe/archive/2010/06/02/5642431.aspx

#6



private void timer1_Tick(object sender, EventArgs e)
  {   
      timer1.Enabled = false; //只触发一次!
       this.ShowInTaskbar = false;
      this.Hide();
       Form2 f2 = new Form2();   
      f2.Show();
  }//from1的隐藏放到show Form2前面试试

#7


该回复于2010-07-30 10:21:55被版主删除

#8


楼主是不是使用form1作为一个启动界面呢?如果是这样,那可以把form2作为主窗体。form1为子窗体咯

#9


引用 8 楼 jocklyhu 的回复:
楼主是不是使用form1作为一个启动界面呢?如果是这样,那可以把form2作为主窗体。form1为子窗体咯
果然聪明!
不过你这么做造成的结果是form1很快关闭了,但是几秒钟后form2才出现,因为form2需要加载很多插件后才能启动。

#10


引用 8 楼 jocklyhu 的回复:
楼主是不是使用form1作为一个启动界面呢?如果是这样,那可以把form2作为主窗体。form1为子窗体咯
不好意思,发错了。不是发给你的,应该引用6楼的,呵呵

#1


肯定是form1有代码又把自己给鼓捣出来了,找到这个代码(例如所谓自定义Paint),让它首先判断该不该执行原来的鼓捣自己的代码,别总是鼓捣自己。

#2


不过,不知道你为什么这样设计。如果是好的应用,不要这样玄的方式对待用户行为!应该把管理两个窗体的职责交给上级的程序(因为你也说两个窗体没有什么关系)。窗体1只应该抛出一个事件,然后什么都不做。应该是那个创建窗体1的程序监听到事件之后,创建窗体2,然后关闭窗体1。关闭,而尽可能不要隐藏。

#3


引用 2 楼 sp1234 的回复:
不过,不知道你为什么这样设计。如果是好的应用,不要这样玄的方式对待用户行为!应该把管理两个窗体的职责交给上级的程序(因为你也说两个窗体没有什么关系)。窗体1只应该抛出一个事件,然后什么都不做。应该是那个创建窗体1的程序监听到事件之后,创建窗体2,然后关闭窗体1。关闭,而尽可能不要隐藏。
那个form1是Program.cs里加载的第一个窗体。这样是不是就不能关闭form1呢?关闭了form1后就全关了貌似。
O(∩_∩)O谢谢啦。我把form1的自定义paint去掉了,还是不行。是不是还有其他解决方法?
后来没办法了,我就把form2的窗体构造函数加了form1这个参数,然后在form2的load方法里让form1的visible=FALSE;这样就行了。但是可以明显的看出来一个效果:form2都显示完毕以后form1才消失。怎么解决这个问题呢?
求救~~~~~~~~~~~~~~~

#4



timer1.Enabled = false; //只触发一次!
  Form2 f2 = new Form2();   
  f2.Show();
 this.Visible=false;



我觉得这样就可以的没必要加那么多代码

#5



new System.Threading.Thread((System.Threading.ThreadStart)delegate  
{   
    Application.Run(new Form());   
}).Start();   
this.Close


语法糖(1) -- 打开新窗体,关闭当前窗体的最简化方法
http://blog.csdn.net/wuyazhe/archive/2010/06/02/5642431.aspx

#6



private void timer1_Tick(object sender, EventArgs e)
  {   
      timer1.Enabled = false; //只触发一次!
       this.ShowInTaskbar = false;
      this.Hide();
       Form2 f2 = new Form2();   
      f2.Show();
  }//from1的隐藏放到show Form2前面试试

#7


该回复于2010-07-30 10:21:55被版主删除

#8


楼主是不是使用form1作为一个启动界面呢?如果是这样,那可以把form2作为主窗体。form1为子窗体咯

#9


引用 8 楼 jocklyhu 的回复:
楼主是不是使用form1作为一个启动界面呢?如果是这样,那可以把form2作为主窗体。form1为子窗体咯
果然聪明!
不过你这么做造成的结果是form1很快关闭了,但是几秒钟后form2才出现,因为form2需要加载很多插件后才能启动。

#10


引用 8 楼 jocklyhu 的回复:
楼主是不是使用form1作为一个启动界面呢?如果是这样,那可以把form2作为主窗体。form1为子窗体咯
不好意思,发错了。不是发给你的,应该引用6楼的,呵呵