7

当您有一个按钮时,请执行以下操作:

Private Function Button_OnClick

    Button.Enabled = False

    [LONG OPERATION] 

End Function

然后按钮不会变灰,因为长操作会阻止 UI 线程重新绘制控件。我知道正确的设计是启动后台线程/调度程序,但有时这对于简单的操作来说太麻烦了。

那么如何强制按钮在禁用状态下重绘呢?我在 Button 上尝试了 .UpdateLayout() ,但没有任何效果。我还尝试了 System.Windows.Forms.DoEvents(),它在使用 WinForms 时通常可以工作,但它也没有效果。

4

3 回答 3

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);
    }

在这里,您将找到有关如何使用 BackgroundWorker 的示例。

于 2011-11-14T22:02:14.730 回答
0

无效视觉();@HCL 是对的......不要这样做

就像你说的,最好开始使用后台线程/调度程序并保持 UI 线程畅通。考虑查看 Microsoft 的Reactive Extensions 库以进行高级异步 ui 编程

于 2011-11-14T21:57:55.053 回答
0

在 Windows.Forms 中,您可以Button.Refresh().

在 Windows.Forms 或 WPF 中,您可以让消息泵让其重绘。Async/Await 旨在让您在没有 HCL 答案的情况下执行此操作。

Private Async Function Button_OnClick

    Button.Enabled = False

    Await Task.Yield

    [LONG OPERATION] 

End Function
于 2017-06-10T08:33:17.873 回答