关闭启动表单会导致应用程序崩溃

时间:2013-05-19 11:10:55

标签: vb.net winforms splash-screen

我制作一个淡入淡出的表单,然后淡出并加载另一个表单。 当新表单加载时,它会关闭启动表单。

问题是当它关闭这个启动形式时它会杀死我的应用程序。

Public Class Splash
Dim appearance As Boolean = False

Private Sub Splash_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Opacity = 0
    FadeIn.Start()
End Sub

Private Sub FadeIn_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FadeIn.Tick
    If Not appearance Then
        Opacity += 0.015
    End If
    If Opacity = 1 Then
        appearance = True
    End If
    If appearance = True Then
        Opacity -= 0.015
        If Opacity = 0 Then
            Form1.Show()
        End If
    End If
End Sub
End Class

Public Class Form1

Private Function WebLoad()
    While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
        Application.DoEvents()
    End While
    Return 0
End Function
Private Function Login(ByVal User As String, ByVal Pass As String)
    WebBrowser1.Navigate("http://caan/SC5/SC_Login/aspx/login_launch.aspx?SOURCE=ESOLBRANCHLIVE")
    WebLoad()
    WebBrowser1.Document.GetElementById("txtUserName").SetAttribute("value", User)
    WebBrowser1.Document.GetElementById("txtPassword").SetAttribute("value", Pass)

    Dim allImgTags As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("img")
    If allImgTags IsNot Nothing Then
        For Each img As HtmlElement In allImgTags
            If img.GetAttribute("src").Contains("/images/SC5Login07.jpg") Then
                img.InvokeMember("Click")
                Exit For
            End If
        Next img
    End If
    Return 0
End Function

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Login(user, pass)
    WebBrowser2.Navigate("http://caan/SC5/SC_PartsCentre/aspx/partscentre_frameset.aspx")
    WebBrowser1.Navigate("http://caan/SC5/SC_RepairJob/aspx/RepairJob_frameset.aspx")
    Splash.Close()
End Sub
End Class

我知道有一个propper启动画面形式,但它不会保持打开足够长的时间。在它的淡出时,它会关闭并启动我的应用程序

我的主要问题是如何阻止splash.close()关闭整个应用程序?

应答

现在对此进行排序,不要让我回答这个问题......

用于在visualbasic express中提供的splashscreen,并在msdn上添加了几行到Application Events

ApplicationEvents

Namespace My

' The following events are available for MyApplication:
' 
' Startup: Raised when the application starts, before the startup form is created.
' Shutdown: Raised after all application forms are closed.  This event is not raised if the application terminates abnormally.
' UnhandledException: Raised if the application encounters an unhandled exception.
' StartupNextInstance: Raised when launching a single-instance application and the application is already active. 
' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.
Partial Friend Class MyApplication
    Protected Overrides Function OnInitialize( _
ByVal commandLineArgs As  _
System.Collections.ObjectModel.ReadOnlyCollection(Of String)) As Boolean 
        Me.MinimumSplashScreenDisplayTime = 7000
        Return MyBase.OnInitialize(commandLineArgs)
    End Function

End Class
End Namespace

SplashScreen1.VB

Public NotInheritable Class SplashScreen1
Dim appearance As Boolean = False

Private Sub SplashScreen1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If My.Application.Info.Title <> "" Then
        ApplicationTitle.Text = My.Application.Info.Title
    Else
        ApplicationTitle.Text = System.IO.Path.GetFileNameWithoutExtension(My.Application.Info.AssemblyName)
    End If

    Version.Text = System.String.Format(Version.Text, My.Application.Info.Version.Major, My.Application.Info.Version.Minor)

    Copyright.Text = My.Application.Info.Copyright

    Opacity = 0
    Fade.Start()
End Sub

Private Sub MainLayoutPanel_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MainLayoutPanel.Paint
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Fade.Tick
    Fade.Interval = 100
    If Not appearance Then
        Opacity += 0.1
    End If

    If appearance = True Then        
        Opacity -= 0.1
        End If
    If Opacity = 1 Then
        Fade.Interval = 5000
        appearance = True
    End If
End Sub
End Class

2 个答案:

答案 0 :(得分:4)

您应该检查项目的应用页面中的Shutdown mode option http://msdn.microsoft.com/en-us/library/tzdks800(v=vs.90).aspx并告诉我们Shutdown modeStartup form的价值。

我猜Shutdown mode设置为When startup form closesStartup form设置为Splash

在这种情况下,请尝试将Shutdown mode设置为On last window close,它应该可以解决您的问题。

答案 1 :(得分:0)

默认情况下,如果“启动表单”花费的时间超过“加载”的时间,则启动画面会保持打开状态两秒或更长时间。

因此,为了让您的启动画面保持打开状态,无论您需要多长时间,只需阻止加载主窗体,直到发出信号为止。一种方法是使用ManualResetEvent。

在此设置中,“启动表单”为Form1,“启动画面”为Splash,“关闭模式”为When startup form closes

在Splash中,我添加了一个Shared ManualResetEvent,并且仅在表单完成动画时发出信号:

Public Class Splash

    Private appearance As Boolean = False

    Public Shared MRE As New System.Threading.ManualResetEvent(False)

    Private Sub Splash_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Opacity = 0
        FadeIn.Start()
    End Sub

    Private Sub FadeIn_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FadeIn.Tick
        If Not appearance Then
            Opacity += 0.015
        Else
            Opacity -= 0.015
        End If

        If Opacity = 1 Then
            appearance = True
        ElseIf Opacity = 0 Then
            MRE.Set()
        End If
    End Sub

End Class

现在,在Form1中,我们针对Shared ManualResetEvent调用WaitOne():

Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim MySplash As Splash = DirectCast(My.Application.SplashScreen, Splash)
        Splash.MRE.WaitOne() ' wait for the splash to signal

        ' ... other code ...

    End Sub

End Class

现在Form1将不会出现,直到启动屏幕完成动画,应用程序将正确地将Form1作为“启动窗体”,因此当关闭启动并且Form1打开时它不会关闭。另请注意,我们未明确打开或关闭代码中的任何表单;这是由框架本身自动完成的。

使用此方法,在启动闪屏完成之前,主窗体不会打开。此外,如果您更改动画长度,则无需进入并更改MinimumSplashScreenDisplayTime(),因为不涉及猜测。