[英]C# Progress Bar not cooperating
我遇到了一個非常奇怪的情況。 這應該是如此簡單,但我不確定為什么會這樣。
我將一個選取框進度條設置為visible = false,因為它是初始狀態。 然后在運行期間的某個時刻,我調用我的一個函數,然后在調用它之前將PB設置為visible = true,在函數結束后,我將其設置為visible = false。 它沒有變得更簡單。
If (something)
{
pb.visible=true;
runMyfunction(x, x, x, x,);
pb.visible=false;
}
問題是我從未見過PB。 如果我注釋掉我的函數並刪除= false,則會顯示PB,但只要我恢復了我的功能,PB就不會出現。
我嘗試了各種方法。 使用If語句確保我在觸摸函數之前得到一個進度條,它仍然保持PB隱藏。
我錯過了什么嗎? 這似乎不應該是如此復雜。 顯示對象,運行函數,隱藏對象。 對? :)
這是因為您的功能正在占用UI線程。 將ProgressBar設置為可見需要釋放UI線程以繪制它,而是繼續處理您的函數,從而沒有時間繪制。
您可以通過調用以下方法解決此問題: Application.DoEvents
停止處理您的方法足夠長的時間來處理一些Windows消息(並執行相關的繪圖)。
Application.DoEvents
的一個大問題是假設你從runMyfunction()
更新你的進度條,你將不得不經常調用Application.DoEvents
來允許你的PB繪制,或者你會看到它,但你永遠不會看到它更新。
更好的解決方案是將runMyfunction()
調用推runMyfunction()
后台線程,並從那里異步更新進度條。 當然,這更復雜,但可以帶來更好的用戶體驗。
我的猜測是myRunFunction()
在UI線程上運行。
嘗試在BackgroundWorker中運行它並在調用RunWorkerAsync
之前啟動ProgressBar並在RunWorkerCompleted
事件中將其停止。
用代碼示例編輯:
public class SomeClass
{
private BackgroundWorker _myFunctionBackgroundWorker;
private SomeProgressBar pb;
public SomeClass()
{
_myFunctionBackgroundWorker = new BackgroundWorker();
_myFunctionBackgroundWorker.DoWork += myFunctionBackgroundWorker_DoWork;
_myFunctionBackgroundWorker.RunWorkerCompleted += myFunctionBackgroundWorker_RunWorkerCompleted;
pb.visible = true;
_myFunctionBackgroundWorker.RunWorkerAsync();
}
private void myFunctionBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
runMyfunction();
}
private void myFunctionBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
pb.visible = false;
}
}
在runMyFunction()
方法內部調用Application.DoEvents()
來強制你的應用重繪並處理windows消息循環:
例如
void myRunFunction()
{
while (someFlag)
{
// do work
pb.Value = someValue;
Application.DoEvents();
}
}
可能是您的功能正在運行並且完成得太快,您無法查看該欄。 我知道我之前已經發生了幾次這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.