我有一個在事件處理程序中更新的一些按鈕的winform。該事件是從後臺線程觸發的,然後通過Invoke方法設置外觀。這些按鈕將被啓用或禁用。但是,在不可預知的時間會發生:爲什麼從後臺線程更新時不刷新UI組件?
- 該按鈕不會在視覺上改變外觀。當它應該被啓用,它仍然看起來像被禁用
- 點擊「禁用」按鈕仍會觸發點擊事件 - 好像它實際上啓用在下面
- 調整大小或移動窗體後,組件的外觀設置正確啓用。
- 只有以這種方式更新的組件纔會受到影響。表單上的其他組件外觀/行爲良好。
這裏是如何的按鈕在代碼中得到更新:
public class Form1 :Form
{
void eventFromThread(object sender, CustomEventArgs e)
{
if(e.enable) RunOnUiThread(ShowEnabledView);
else RunOnUiThread(ShowDisabledView);
}
void ShowEnabledView()
{
button1.Enabled = true;
}
void ShowDisabledView()
{
button1.Enabled = false;
}
void RunOnUiThread(MethodInvoker method)
{
try
{
if(InvokeRequired)
{
Invoke(method);
}
else
method.Invoke();
}
catch(ObjectDisposedException)
{ return;}
catch(InvalidOperationException)
{return;}
}
}
我試圖強制刷新按鈕,現在也沒有再發生但,但其只去過一些日子。這個問題似乎在它想要的時候彈出,所以我不能確定我正在修復任何東西。任何人都可以對此有所瞭解嗎?
刪除try/catch塊後,它被隱藏的錯誤。 – 2010-04-16 20:15:33