WPF如何在继续处理代码之前等待绑定更新完成?

8
据我了解,调度程序在另一个线程中运行,负责更新数据绑定、布局等。不过,有没有办法等到调度程序没有更多的项目或至少没有更多的数据绑定?我想确保属性更改已经更新了其所有组件,并在运行更多代码之前运行依赖的属性更改回调函数。
编辑:所以我猜这并不需要,我只是想知道我应该做什么。我的主要问题在于:WPF 如果 ScrollViewer 的子元素调整大小,它会自动更新其范围吗? 但我也好奇是否可以等待绑定更新,或者是否有任何保证一个绑定在另一个绑定之前更新?我是否应该编写代码,使得绑定更新的顺序无关紧要?目前,我使用依赖属性更改回调来执行各种通常依赖于其他属性更新的操作。

2
你能描述一下为什么这是必要的吗?实际上,它不应该是必要的,可能存在更好的方法来完成你真正想要做的事情。 - user7116
4
你可以查看Dispatcher.BeginInvoke()方法,特别是接受DispatcherPriority参数的重载版本。我的翻译不改变原文意思,力求通俗易懂。 - Federico Berasategui
1
我记得曾经写过一个关于WPF加载时事件顺序的答案,你可能会觉得有用。但是HighCore建议使用Dispatcher可能是你正在寻找的。 (此外,Dispatcher引用主UI线程,并且它具有在该线程上以不同优先级运行代码的能力。 它实际上并不是一个单独的线程) - Rachel
你尝试过在_Dispatcher.Invoke_中调用一个空的操作吗?就像这样:Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.Render, null); - Ramin
这个回答解决了你的问题吗?在WPF中Application.DoEvents()在哪里? - StayOnTarget
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()即可完成。

我得到了 CS1660 无法将 lambda 表达式转换为类型 'Delegate',因为它不是委托类型 - Scott Solmer
谢谢回答,好主意!稍作修改: Application.Current.Dispatcher.Invoke(() => { }, System.Windows.Threading.DispatcherPriority.Background); - Andrey Burykin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接