在WPF中,什么是Windows Forms中的Suspend/ResumeLayout()和BackgroundWorker()

mrb*_*eyt 13 .net c# wpf backgroundworker

如果我在后面的代码中的函数中,并且我想在状态栏中实现显示"正在加载...",则以下内容是有意义的,但正如我们从WinForms中知道的那样是NoNo:

StatusBarMessageText.Text = "Loading Configuration Settings...";            
LoadSettingsGridData();
StatusBarMessageText.Text = "Done";
Run Code Online (Sandbox Code Playgroud)

我们现在从WinForms第1章101类开始,在整个函数完成之前,表单不会显示对用户的更改...意味着"加载"消息将永远不会显示给用户.需要以下代码.

Form1.SuspendLayout();    
StatusBarMessageText.Text = "Loading Configuration Settings...";                
Form1.ResumeLayout();

LoadSettingsGridData();

Form1.SuspendLayout();    
StatusBarMessageText.Text = "Done";
Form1.ResumeLayout();
Run Code Online (Sandbox Code Playgroud)

在WPF中处理这个基本问题的最佳做法是什么?

小智 33

最简单的:

using(var d = Dispatcher.DisableProcessing())
{
    /* your work... Use dispacher.begininvoke... */
}
Run Code Online (Sandbox Code Playgroud)

要么

IDisposable d;

try
{
    d = Dispatcher.DisableProcessing();
    /* your work... Use dispacher.begininvoke... */
} finally {
    d.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

  • 当然你想把它放到`using(var d = Dispatcher.DisableProcessing())`中,这样任何异常都不会让它永久禁用. (14认同)
  • 有点危险,因为这会暂停调度程序而不仅仅是单个窗口,因此只要使用同一调度程序运行,所有 UI 操作都将停止。(大多数情况下都是如此) (2认同)

Abe*_*cht 0

实现此功能的最简单方法是将 LoadSettingsGridData 添加到调度程序队列。如果您将操作的 DispatcherPriority 设置得足够低,布局操作就会发生,您就可以开始了。

StatusBarMessageText.Text = "Loading Configuration Settings...";
this.Dispatcher.BeginInvoke(new Action(LoadSettingsGridData), DispatcherPriority.Render);
this.Dispatcher.BeginInvoke(new Action(() => StatusBarMessageText.Text = "Done"), DispatcherPriority.Render);
Run Code Online (Sandbox Code Playgroud)