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

Mui*_*uis 7 wpf user-interface dispatcher ui-thread

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

Private Function Button_OnClick

    Button.Enabled = False

    [LONG OPERATION] 

End Function
Run Code Online (Sandbox Code Playgroud)

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

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

HCL*_*HCL 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

  • @edvaldig:我强调不要使用它,但是我已经给了他正在寻找的代码.我不认为这对你来说是值得的-1.如果我的代码不起作用,那么给我一个-1,但不是为了给出一些额外的建议.我不认为这是公平的. (2认同)