使用vb.net将图像列表加载到列表框时添加进度条

使用vb.net将图像列表加载到列表框时添加进度条,vb.net,progress-bar,Vb.net,Progress Bar,我正在尝试使用“打开文件”对话框和“文件夹浏览”对话框添加图像,并将图像列表填充到列表框中。添加这些图像时,我需要显示加载的每个图像的进度条 我正试图得到它,但当进度条的值在25或40左右时,它将在该点停止,但我需要显示进度条,直到它完成100%,然后填充图像列表 我该怎么做 这是我的密码: Private Sub AddImages_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Add

我正在尝试使用“打开文件”对话框和“文件夹浏览”对话框添加图像,并将图像列表填充到列表框中。添加这些图像时,我需要显示加载的每个图像的进度条

我正试图得到它,但当进度条的值在25或40左右时,它将在该点停止,但我需要显示进度条,直到它完成100%,然后填充图像列表

我该怎么做

这是我的密码:

    Private Sub AddImages_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddImages.Click

    If Not Directory.Exists(Application.StartupPath + "\Backup\") = True Then
        Directory.CreateDirectory(Application.StartupPath + "\Backup\")
    End If



    OpenFileDialog1.FileName = "Select a Image"
    OpenFileDialog1.Multiselect = True
    OpenFileDialog1.InitialDirectory = "C:\Users\Public\Pictures\Sample Pictures"
    OpenFileDialog1.Filter = "All Type Of Image Files|*.*|Joint Photographic Experts Group [JPEG]|*.jpg|Bitmap [BMP|*.bmp|Tagged Image File Format [TIFF]|*.tiff|Portable Network Graphics [PNG]|*.png"
    If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then

        ProgressBar2.Show()
        ProgressBar2.Step = 10
        Dim str As String
        For Each str In OpenFileDialog1.FileNames
            Load.Text = "Loading..."

            Dim fso As New FileSystemObject
            Dim MyName As String
            Dim MyExtension As String

            MyName = fso.GetFileName(CStr(str))
            MyExtension = fso.GetExtensionName(MyName)

            System.IO.File.Copy(str, Application.StartupPath + "\Backup\" + MyName & "." & MyExtension, True)

            CheckedListBox1.Items.Add(str, CheckState.Checked)
            Thumbcontrol1.AddThumbnail(str)
            Thumbcontrol1.BackgroundImage = Nothing
            CheckedListBox1.SelectedIndex = 0
            ProgressBar2.PerformStep()
        Next
        SaveProject.Enabled = True
        Delete.Enabled = True
        Edit.Enabled = True
        ClearAll.Enabled = True
        CheckAll.Enabled = True
        UncheckAll.Enabled = True
        Timer1.Stop()
        Load.Text = "Loading Completed"
    Else
    End If
    ProgressBar2.Visible = False
    Load.Text = Nothing

End Sub

不要使用UI进行加载。使用后台工作程序。BackgroundWorker在另一个线程中工作,它可以报告进度以将其绑定到进度条。

进度条停止移动,因为Windows认为您的程序有严重错误。它将主窗口替换为“重影”窗口,因为标题栏上显示“无响应”

它这样做是为了帮助提醒用户,您的程序对世界来说是死的,不会响应用户的任何输入。点击鼠标或敲击键盘不会产生任何效果,用户所能做的就是在代码运行时无助地观看


这并不是一个理想的用户界面。您可以通过使用BackgroundWorker来解决这个问题,以便在单独的线程上完成繁重的工作。让用户界面线程响应。请务必阅读MSDN文章,以便知道该怎么做,您必须调整代码。

删除
ProgressBar2.Step=10
行,然后执行以下操作:

        Dim str As String
        Dim counter As Integer 'new!
        For Each str In OpenFileDialog1.FileNames
            Load.Text = "Loading..."

            Dim fso As New FileSystemObject
            Dim MyName As String
            Dim MyExtension As String

            MyName = fso.GetFileName(CStr(str))
            MyExtension = fso.GetExtensionName(MyName)

            System.IO.File.Copy(str, Application.StartupPath + "\Backup\" + MyName & "." & MyExtension, True)

            CheckedListBox1.Items.Add(str, CheckState.Checked)
            Thumbcontrol1.AddThumbnail(str)
            Thumbcontrol1.BackgroundImage = Nothing
            counter += 1 'new
            CheckedListBox1.SelectedIndex = 0
            ProgressBar2.Value = (counter * 100) / OpenFileDialog1.FileNames.Length 'new
        Next

它没有解决不使用线程的问题,正如其他答案所指出的那样。

我不明白。您正在将每个文件的
ProgressBar2
值增加10(在
OpenFileDialog1.FileNames
中)。你怎么知道有多少文件?它可能是2或20-您没有检查它。为什么不忘记
步骤
,在循环中添加一个计数器(跟踪加载了多少文件),然后调用
ProgressBar2.Value=(计数器*100)/OpenFileDialog1.FileNames
而不是
PerformStep
是的,这就是我的想法,但实际上我们不知道它们可以添加多少,当我添加时,它给我的错误是运算符“/”没有为类型“Double”和“一维字符串数组”定义。我的错误,请尝试
ProgressBar2.Value=(计数器*100)/OpenFileDialog1.FileNames.Length
当然可以。
OpenFileDialog1.FileNames
返回用户选择的文件名数组。它的
Length
属性将返回许多文件名。您需要将已加载的文件数除以文件总数。