奇怪的行为绑定与属性更改和繁忙的纯属性UIThread
问题描述:
我有这样的属性。奇怪的行为绑定与属性更改和繁忙的纯属性UIThread
public double RollDegrees
{
get
{
return rollDegrees;
}
set
{
if (rollDegrees != value)
{
rollDegrees = value;
OnPropertyChanged(PROPERTY_NAME_ROLL_DEGREES);
}
}
它绑定到一个xaml控件,并且UI在正常情况下更新完美。 此属性在非UI线程上更新,但据我所知,使用普通属性对Dispatcher.BeginInvoke进行更新并不是必须的。
但是,当应用程序正在UI线程上运行繁忙的更新(地图控件随更新而快速移动)此属性的UI绑定未更新,则当繁忙更新完成属性时,将再次更新UI。
但如果我把
Application.Current.Dispatcher.BeginInvoke((Action)(() =>
{
RollDegrees = (OperationEntity as Level).RollDegrees;
}));
然后UI完美的作品
为什么这种情况正在发生任何提示?也许在忙碌的更新中有什么?或者当UI调度程序已满且繁忙时,这是正常行为?
答
所有UI元素只应在UI线程中更新。每个线程都有自己的调度程序。如果您需要从非UI线程更新UI,请致电Application.Current.Dispatcher.BeginInvoke()
。因此这是正常的行为。
在第一种情况下,您正在更新属性,但不是从UI线程。因此,直到UI线程开始运行时才引起延迟。当您使用Application.Current.Dispatcher.BeginInvoke()
时,UI会立即更新。
所以,如果你想反映一些来自不同线程的UI相关变化,请使用Application.Current.Dispatcher.BeginInvoke()
。
但我读了WPF marshalls属性更改为UI线程。但是当UI线程忙时,这不起作用? – isra60
这就是为什么它在UI线程变为空闲时工作。 – ViVi
所以.. WPF自动编组提出低优先?? ?? – isra60