1

在我需要添加功能之前,我有这条线工作:

    public MainForm()
    {
        InitializeComponent();
        refreshUI();
    }

然后我需要在显示 MainForm 之前显示一个welcomeBox 几秒钟。所以我改变了这样的代码:

    System.Threading.Timer timer;
    GUI.WelcomeBox welcomeBox;
    public MainForm()
    {
        this.Visible = false;
        //Showing welcome box
        welcomeBox = new GUI.WelcomeBox();
        welcomeBox.Visible = true;
        this.Visible = false;

        timer = new System.Threading.Timer(new System.Threading.TimerCallback(delayedActions),null,5000,2000);
    }

    private void delayedActions(object o)
    {
        welcomeBox.Visible = false;
        welcomeBox.Close();
        timer.Dispose();

        InitializeComponent();
        // this line is unreachable, because of error
        refreshUI();
    }

但发生错误InitializeComponent():问题事件名称:CLR20r3

  Problem Signature 01: todoweeklyshedule.exe
  Problem Signature 02: 1.0.0.0
  Problem Signature 03: 4fc5385b
  Problem Signature 04: System.Windows.Forms
  Problem Signature 05: 4.0.0.0
  Problem Signature 06: 4ba1e14e
  Problem Signature 07: a11
  Problem Signature 08: 1b
  Problem Signature 09: System.ArgumentException
  OS Version:   6.1.7601.2.1.0.768.3
  Locale ID:    1033
  Additional Information 1: a1ee
  Additional Information 2: a1ee2874cedcaa72f2a8419ddd18697e
  Additional Information 3: a319
  Additional Information 4: a319510eabcccf7de47b58017b885ff3

顺便说一句,MainForm 将与this.Visible = false;行一起显示。我打电话给 MainForm()Application.Run(new MainForm());是这个原因吗?

4

2 回答 2

1

在调用 InitialiseComponents 之前无法设置可见,您可能会解决这个问题,但您真正的问题是您的代码位于错误的位置。

将其全部移入 program.cs,并在 Application.Run(new MainForm()); 之前调用它 如果是我,我会将计时器移到欢迎框中,让事件处理程序关闭它并以模态方式显示它。

好吧,实际上这不是真的,如果是我,我不会这样做,因为我知道这会惹恼该应用程序的任何用户。

于 2012-05-29T21:29:46.350 回答
0

将初始化组件移到 this.visible=false; 之前

  public MainForm()
  {
    InitializeComponent();
    this.Visible = false;
    //Showing welcome box
    welcomeBox = new GUI.WelcomeBox();
    welcomeBox.Visible = true;
    this.Visible = false;

    timer = new System.Threading.Timer(new System.Threading.TimerCallback(delayedActions),null,5000,2000);

下一个最佳建议是将您的欢迎框作为主表单,然后将其更改为您的主表单,这将是一些重写,但值得。

最后的建议是加载您的主表单并将欢迎框称为 showdialog(),它会在您的计时器告诉它之后关闭。

于 2012-05-30T12:14:58.230 回答