我有一个在事件处理程序中更新的一些按钮的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