关闭表格'从另一种形式'

时间:2011-09-10 22:03:48

标签: c# winforms

我开发了一个应用程序,我使用Windows窗体作为启动画面。显示启动画面后,我创建了一个新线程来触发新窗体。现在我想在显示表单后关闭启动画面。

我搜索了我的查询,许多讨论但找不到我想要的内容。

请指导我一点。

感谢。

5 个答案:

答案 0 :(得分:3)

只要您对第一个表单有一些引用,就可以在另一个表单中调用Close()方法。因此,当您创建第二个表单时,请为其指定启动画面。然后将处理程序附加到Shown事件并在启动屏幕上调用close。

为了解决交叉线程问题,您需要创建一个名为ThreadSafeClose的方法,并将其定义如下。然后调用该方法而不是.Close()

public void ThreadSafeClose() {
        if(this.InvokeRequired) {
            this.Invoke(new MethodInvoker(this.Close));
        }
    }

答案 1 :(得分:3)

要关闭表单,您需要指向此表单的链接。最简单的方法是向程序中的Program对象添加一个新属性,该对象是静态的,并且随处可用。只需修改您的Program.cs文件即可将Program类设为公开,并添加相应的参考:

public static class Program
{
    ///This is your splash screen
    public static Form1 MySplashScreen = new Form1();

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        /// This is how you run your main form
        Application.Run(MySplashScreen);
    }
}

然后在表单中,您可以使用以下语法轻松关闭启动画面:

Program.MySplashScreen.Close();

编辑:在WinForms中只有一个GUI线程,因此只要您从另一个表单中执行关闭,它应该是安全的。如果要从GUI生成的工作线程关闭表单,请使用以下代码(这应该引用您的第二个表单):

this.Invoke((MethodInvoker)delegate {
            Program.MySplashScreen.Close();
});

答案 2 :(得分:1)

通常您不需要新线程。但是一旦你拥有它,你可以通过在两个线程之间共享一个bool值(将其命名为closeSplash)来实现它。

在启动窗体上放置一个计时器,每秒检查closeSplash的值。当closeSplash为true时,只需调用Splash表单的Close()方法。

如果您选择关闭其他主题的启动,请参阅this

答案 3 :(得分:0)

我使用的是一种hacky方法..虽然可能不是最好的选择。 在初始屏幕窗体中声明一个自身的静态实例。

public static SplashForm splashInstance;

然后在splashform的构造函数中,您可以赋值“this”。

SplashForm.splashInstance = this;

现在,您可以在应用内的任何位置调用SplashForm.splashInstance.Close()。

答案 4 :(得分:0)

需要一个单独的线程只是为了在一段时间内显示“闪屏”。实际上,有更好的方法可以设计您的类,使这样做更容易完成。在这里不使用计时器或使用单独的线程不是正确的解决方案恕我直言。我建议你尝试这样做:

public class SplashScreen : Form
{
    // add a timer to your form with desired interval to show

    protected override void OnShown(EventArgs e)
    {
        displayTimer.Start();
        base.OnShown(e);
    }

    private void displayTimer_Tick(object sender, EventArgs e)
    {
        this.Close();
    }
}

public class MainForm : Form
{
    protected override void OnLoad(EventArgs e)
    {
        // splash screen will be shown before your main form tries to show itself
        using (var splash = new SplashScreen())
            splash.ShowDialog();
        base.OnLoad(e);
    }
}