【问题标题】:VB - Issues With Progress BarVB - 进度条问题
【发布时间】:2015-07-11 05:19:57
【问题描述】:

我正在制作一个简单的进度条,用作我的应用程序中的初始屏幕,但是在执行代码时,加载条没有到达进度条的末尾。

我用过代码:

splashprogressbar.Increment(1) 
    If splashprogressbar.Value = 100 Then 
        Main_Menu.Show() 
        Me.Hide() 
    End If

当进度条达到100(已设置为最大值)时打开表单。

这个问题更多地与外观而不是功能有关,但我仍然想了解为什么会发生这种情况并希望得到修复。

为了澄清,Main_Menu 表单会在栏完成大约 3/4 时打开,我无法理解为什么会发生这种情况。有什么想法吗?

【问题讨论】:

  • 无论我做什么,除非我将最大值更改为小于条件值的数字,在本例中为 100,否则条不会到达末尾,但这不会执行语句跨度>
  • ProgressBar 实际上“动画化”到新值(它不会立即跳转)并且根本没有时间到达那里,因为您调用了 Hide()。请参阅此问题中的 David Heffernan 的 hack here
  • 这是一个众所周知的“错误”。以下欺骗链接中有一个修复:Disabling .NET progressbar animation when changing value?

标签: vb.net progress-bar controls


【解决方案1】:

我无法想象VB有这样的错误。可能您正在运行导致该问题的旧的或不兼容的“.Net Framework”。 您可以尝试在运行程序时以编程方式设置进度条最大值。 在Form1_Load 事件中使用此代码:

ProgressBar1.Maximum = 100

它应该工作。但如果不是,也许它只是代码相关的。尝试以这种方式填充进度条(必须在计时器中):

If splashprogressbar.Value = splashprogressbar.Maximum Then 
    Main_Menu.Show() 
    Me.Hide() 
Else
    splashprogressbar.Value += 100
End If

只是一个友好的建议:您似乎正在模拟一个假装的加载栏,然后才打开应用程序(可能会浪费用户的时间)。不要那样做。

【讨论】:

  • 哦,当然,如果这个程序要被专业使用,那么按照我的方式实现它当然是愚蠢的,它只是为了视觉吸引力,它是模块的一部分- 不幸的是,您使用的代码似乎也无法修复它,但感谢您的尝试
【解决方案2】:

您也可以尝试查看以下链接。这可能对您的方法有所帮助;

Trigger Background Worker

以下内容是从上面的链接复制的...

Dim WithEvents bgWorker As New BackgroundWorker With { _
.WorkerReportsProgress = True, _
.WorkerSupportsCancellation = True}

Private Sub bgWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker.DoWork
    For i As Integer = 0 To 100
        'Threw in the thread.sleep to illustrate what's going on.  Otherwise, it happens too fast.
        Threading.Thread.Sleep(250)
        bgWorker.ReportProgress(i)
    Next
End Sub

Private Sub bgWorker_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgWorker.ProgressChanged
    If e.ProgressPercentage Mod 10 = 0 Then
        MsgBox(e.ProgressPercentage.ToString)
    End If
End Sub

Private Sub bgWorker_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgWorker.RunWorkerCompleted
    MsgBox("Done")
End Sub

【讨论】:

    【解决方案3】:

    你可以试试这样的;

     Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    
        Me.Show()
    
        Dim i As Integer
    
        splashprogressbar.Minimum = 0
        splashprogressbar.Maximum = 100
    
        If splashprogressbar.Value < splashprogressbar.Maximum Then
    
            For i = 0 To 100
                splashprogressbar.Value = i
                Application.DoEvents()
                System.Threading.Thread.Sleep(100)
            Next
        End If
        Me.Hide()
        MsgBox("Here I am") 'Use your "Main_Menu.Show" here
    
    End Sub
    

    【讨论】:

    • 这将冻结主 UI。
    • 怎么样?你需要更好地解释一下......文森特在这里工作得很好。您必须记住调整线程/睡眠时间。作为一个夸张的例子,我将线程/睡眠时间设置为 100。
    • 好吧,我明白了,我错过了Application.DoEvents() 行,一定是因为网站的移动版本。但请记住,即使这应该是一个启动画面,以正常(可关闭)形式使用您的代码将在您关闭应用程序时保持应用程序处于活动状态,直到进度条达到最大值。当达到最大值时,它也会抛出 NullReferenceException 异常,可能是因为进度条被释放了。
    • 提出问题的用户 (Bustin Jeiber) 从未提及关闭应用程序。我真的不确定您为什么也看到 NullReferenceException 状态,但再次编写代码至少满足他的问题的一些想法并展示可用性。除此之外,没有提及是否保持表单处于活动状态,因此代码被设计/编写为问题是什么以及他的以下解释......如果有关于关闭表单并具有完全逻辑的问题关闭表单,可以添加很多逻辑来处理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多