2012-03-09 104 views
0

在我的splash代码中出现错误。 这是一个单独的形式,以经常。Splash Form Error,多种形式

public Form1() 
    { 

     InitializeComponent(); 
     Thread t1 = new Thread(new ThreadStart(SplashForm)); 
     t1.Start(); 
     Thread.Sleep(5000); // The amount of time we want our splash form visible 
     t1.Abort(); 
     Thread.Sleep(1000); 
    } 

基本上说(新的ThreadStart(SplashForm))的部分;

我得到 “SplashForm” 错误。

防溅形式是形式的名称。它表示它是一种类型,但被用作变量。

任何想法?

+0

'ThreadStart'构造函数有一个方法的名称,而不是一个类型(您的形式是一种类型)。 – vulkanino 2012-03-09 09:25:16

+0

这不是实现启动画面的好方法,因为您仍然会在主窗体悬挂在背景中并且一旦启动画面完成后延迟加载。 Google C#启动画面,超过80,000项结果。 [C#闪屏问题]的 – Lloyd 2012-03-09 09:25:48

+0

可能重复(http://stackoverflow.com/questions/392864/c-sharp-splash-screen-problem) – 2012-03-09 10:33:45

回答

0

你必须对线程,而不是一个类型(SplashForm)的构造函数的方法名称。 你可以做这样的事情:

public Form1() 
{ 
    InitializeComponent(); 
    new SplashForm().ShowDialog(); 
} 

,并在SplashForm类:如果你从另一个线程调用异常

class SplashForm : Form 
{ 
    public SplashForm() 
    { 
     InitializeComponent(); 
     new Thread(run).Start(); 
    } 

    private void run() 
    { 
     Thread.Sleep(5000); 
     this.Invoke((MethodInvoker)delegate 
     { 
      this.Close(); 
     }); 
    } 
} 

,你应该尝试与MethodInvoker的伎俩。

+0

精彩,1UP但一个问题..我得到一个异常: 未处理System.Windows.Forms.dll中发生类型'System.InvalidOperationException'的异常 附加信息:跨线程操作无效:控制的“SplashForm”可以从创建线程以外的线程访问。 – 2012-03-09 09:46:28

+0

Googeling该错误消息会带来多个结果,这些结果描述的事实是,您无法从未创建该元素的线程更改用户界面元素,并且应该使用'Control.Invoke'来执行此操作。 – 2012-03-09 09:54:08

+0

我不知道如何去做,因为它不是一个你点击的元素..即时通讯如此困惑:/ – 2012-03-09 10:16:12

0

如果你的.NET版本> = 3.5,你可以使用SplashScreen类:

SplashScreen ss = new SplashScreen ("resource name"); 
ss.Show(true); // autoclose 

无需编写任何代码来显示启动画面。

在Visual Studio 2008 SP1开始,您可以快速配置使用默认设置启动画面。

无论如何,你的代码是错误的,因为ThreadStart构造函数接受方法的名称,而不是类型(你的表单是类型)。

+1

超过.Net 3.5的要求,'SplashScreen'要求应用程序是一个WPF应用程序。由于OP在谈论“Forms”,我认为他将无法使用它。 – ken2k 2012-03-09 09:35:40