0

我有一个SplashScreenMainForm

在我的MainForm_Load我有一个名为Connect();. 这种方法可以验证我的 RFID 设备与 SerialPort 的连接,并且需要几秒钟才能完成。

当它通过该Connect()方法时,我想展示我的SplashScreen. 我试过这个:

private void Main_Load(object sender, EventArgs e)
{
    Frm_Splash s = new Frm_Splash();
    s.Show();
    Connect();            
}

Connect();方法使用 显示一条消息MessageBox。但是当SplashScreen结束时,它会自行关闭并关闭 MessageBox。

这是我的SplashScreen表单代码:

private void timer1_Tick(object sender, EventArgs e)
{
    if (pbLoad.Value < 100)
       {
          pbLoad.Value = pbLoad.Value + 1;
       }
    else
       {
          timer1.Enabled = false;
          this.Close();
       }
}

我知道这与this.Close();. 我只是不知道如何解决它。

也许如果我使用this.Visible = false,但SplashScreen不会关闭,它仍然会处理,只是不可见......我认为有更好的选择。

4

2 回答 2

4

我想你正在使用MessageBox.Show()...打开你的消息框而不是这个,使用MessageBox.Show(this,"message");

我想正在发生的事情是您的消息框父级设置为启动画面,因为这是具有焦点的对话框

于 2013-06-20T20:47:27.000 回答
1

这是我的启动画面:

namespace MyNamespace
{
    public partial class frmSplashScreen : Form
    {
        private static frmSplashScreen splashScreen = null;
        private static Thread splashThread = null;
        private Double opacityInc = .03;
        private Double opacityDec = .1;
        private const Int32 iTimerInterval = 30;

        public frmSplashScreen()
        {
            InitializeComponent();

            Opacity = .0;
            timer1.Interval = iTimerInterval;
            timer1.Start();
        }

        private void frmSplashScreen_Load(Object sender, EventArgs e)
        {
            CenterToScreen();
        }

        public static void ShowSplashScreen()
        {
            if (splashScreen != null)
                return;
            splashThread = new Thread(new ThreadStart(frmSplashScreen.ShowForm));
            splashThread.IsBackground = true;
            splashThread.SetApartmentState(ApartmentState.STA);
            splashThread.Start();
        }

        private static void ShowForm()
        {
            splashScreen = new frmSplashScreen();
            Application.Run(splashScreen);
        }

        public static void CloseForm()
        {
            if (splashScreen != null)
                splashScreen.opacityInc = -splashScreen.opacityDec;
            splashThread = null;
            splashScreen = null;
        }

        private void timer1_Tick(Object sender, EventArgs e)
        {
            if (opacityInc > 0)
            {
                if (Opacity < 1)
                    Opacity += opacityInc;
            }
            else
            {
                if (Opacity > 0)
                    Opacity += opacityInc;
                else
                    Close();
            }
        }
    }
}

我通过在我希望它从中弹出的窗体的构造函数中调用它来激活它:

frmSplashScreen.ShowSplashScreen();

然后Shown以相同的形式将其关闭:

frmSplashScreen.CloseForm();

注意:我提供这个是因为它使用static类,这有助于缓解所有权问题。

于 2013-06-20T20:41:23.130 回答