当你有一个按钮时,执行以下操作:
Private Function Button_OnClick
Button.Enabled = False
[LONG OPERATION]
End Function
然后该按钮不会变灰,因为长操作会阻止UI线程重新绘制控件。我知道正确的设计是启动后台线程/调度程序,但有时这对于简单的操作来说太麻烦了。
那么如何强制按钮在禁用状态下重绘?我在Button上尝试了.UpdateLayout(),但它没有任何效果。我也尝试了System.Windows.Forms.DoEvents(),它通常在使用WinForms时有效,但它也没有效果。
答案 0 :(得分:8)
以下代码可以满足您的需求。但是我不会用它。使用BackgroundWorker类进行长时间操作。它易于使用且非常稳定 代码如下:
public static void ProcessUITasks() {
DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(delegate(object parameter) {
frame.Continue = false;
return null;
}), null);
Dispatcher.PushFrame(frame);
}
Here您将找到有关如何使用BackgroundWorker的示例。
答案 1 :(得分:0)
InvalidateVisual(); @HCL是对的...不要这样做
就像你说的,最好开始使用后台线程/调度程序并保持UI线程畅通无阻。考虑从Microsoft的Reactive Extensions library查看高级异步ui编程