8

据我了解,调度程序发生在另一个线程中,该线程负责更新数据绑定、布局等。但是,有没有办法等到调度程序没有更多项目或至少没有更多数据绑定?我想确保属性更改已更新其所有组件并在运行更多代码之前运行相关属性更改回调。

编辑:所以我猜这不是必需的,我只是想了解我应该做什么。我的主要问题是WPF 如果滚动查看器的子级调整大小,滚动查看器会自动更新其范围吗?

但我也很好奇我是否可以等待绑定更新,或者是否可以保证一个绑定在另一个之前更新?我是否应该编写代码以使绑定更新的顺序无关紧要?目前我使用依赖属性更改回调执行各种通常依赖于其他属性更新的东西

4

1 回答 1

9

调度程序有几个优先级来处理单个任务。我很确定您不能更改依赖属性回调的优先级。如果它们被数据绑定更改,它们将以 DispatcherPriority.DataBinding 优先级排队。您操纵一些依赖属性的值,这会导致布局/其他依赖属性发生变化。并且您想在第一次操作之后等到这些布局更新/更改被处理,然后对当前的 UI 状态执行一些操作?

WinForms 有针对这种情况的 DoEvents 函数,这会导致在正常代码执行继续之前处理所有 UI 事件。WPF 没有这样的内置函数,但您可以编写自己的 DoEvents:

public static void DoEvents()
{
  if (Application.Current == null)
    return;
  Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, (Delegate) (() => {}));
}

空委托是同步调用的,这意味着调用在委托被调度程序执行后返回。DispatcherPriority.Background 是一个非常低的优先级,以便在数据绑定、布局更新或渲染之后处理此调度程序调用。 http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcherpriority.aspx

所以在你第一次操作依赖属性之后和你想读取其他依赖属性之前调用 DoEvents() 并且应该完成。

于 2013-08-26T13:21:59.247 回答