在长时间运行操作之前强制重绘

时间:2011-11-14 21:50:31

标签: wpf user-interface dispatcher ui-thread

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

Private Function Button_OnClick

    Button.Enabled = False

    [LONG OPERATION] 

End Function

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

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

2 个答案:

答案 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编程