所以我的問題可能聽起來很熟悉,我只是想與我的程序中正在處理的數據同時更新進度條。更新進度條WPF Visual Studio
我有兩個窗口:StartupWindow和UpdateWindow。 應用程序從創建啓動窗口開始,用戶將按下按鈕打開UpdateWindow。以下是按鈕的代碼:
Private Sub btnUpdateClick(sender As Object, e As RoutedEventArgs) Handles btnUpdate.Click
Dim updateWindow As New UpdateWindow
updateWindow.ShowDialog()
btnUpdate.IsEnabled = False
End Sub
有了這個代碼,我得到了錯誤大多數其他人做的事:「因爲不同的線程擁有它調用線程不能訪問該對象」
Private Sub updateDevice()
Dim currPercent As Integer
currPercent = ((sentPackets/totalPacketsToWrite) * 100)
progressLabel.content = currPercent.ToString + "%"
pb.Maximum = totalPacketsToWrite
pb.Value = sentPackets
If sentPackets < totalPacketsToWrite Then
'....update....
Else
MsgBox("Device now has update stored on flash!")
'...close everything up
End If
End Sub
這裏有三件事至今我曾嘗試:
- 使用調用/調度員/代表,試圖似乎只能夠把更新在不同的線程的排隊?似乎無法暫停其他線程更新用戶界面要麼...
- 實現BackgroundWorker類,並使用它的報告進度,這工作,但我只能更新
bw.DoWork
下的進度條我打了很多電話並且有來自外部設備的響應,所以很難將我的所有代碼放在一個函數中。 - 我在某處讀到,因爲這是第二個創建的窗口(從原來的窗口調用),我會遇到問題。所以我把別人的解決方案,並試圖當按下「更新」按鈕,即:
一些需要注意的是,我加入了「取消」按鈕來創建和整個新的線程:
Private Sub buttonStart_Click(sender As Object, e As RoutedEventArgs) Handles btnStart.Click
btnStart.IsEnabled = False
btnStart.Visibility = Windows.Visibility.Hidden
btnCancel.IsEnabled = True
btnCancel.Visibility = Windows.Visibility.Visible
beginUpdate()
End Sub
Private Sub buttonCancel_Click(sender As Object, e As RoutedEventArgs) Handles btnCancel.Click
btnStart.IsEnabled = True
btnStart.Visibility = Windows.Visibility.Visible
btnCancel.IsEnabled = False
btnCancel.Visibility = Windows.Visibility.Hidden
'TODO MAKE IT CANCEL
End Sub
每次我點擊更新/取消按鈕,進度條都會更新。每次我按下按鈕時,都會刷新進度條到當前的完成狀態。我很困惑,我能夠更新用戶界面,如果它只是一個窗口......但如果用戶按下一個按鈕來調用一個新窗口,我不能在第二個窗口中更新任何東西。有什麼建議麼?
編輯: 我最終使我的長代碼更新的全局變量。第一
Private Sub buttonStart_Click(sender As Object, e As RoutedEventArgs) Handles btnStart.Click
bw.RunWorkerAsync()
beginUpdate()
End Sub
嘿感謝您的回覆和您的鏈接,它幫助我。我將一個百分比作爲全局變量,並在我的代碼開始處運行backgroundworker,DoWork方法在我的帖子底部進行編輯。 這很簡單,但它的工作!再次感謝您指引我朝着正確的方向發展。 – JumpingRock
不客氣。一如既往......逐步發展簡化了複雜的情況。 – Sheridan