奇怪的行为与属性更改和忙UIThread的普通属性绑定

时间:2016-11-17 12:32:03

标签: wpf binding dispatcher

我有这样的房产。

public double RollDegrees
    {
        get
        {
            return rollDegrees;
        }
        set
        {
            if (rollDegrees != value)
            {
                rollDegrees = value;
                OnPropertyChanged(PROPERTY_NAME_ROLL_DEGREES);
            }
        }

它绑定到xaml控件,UI更新在正常条件下完美。 此属性在NON-UI线程上更新,但据我所知,将更新放在具有普通属性的Dispatcher.BeginInvoke上是不必要的。

但是当应用程序在UI线程上运行繁忙更新时(地图控件快速移动更新)此属性的UI绑定未更新,然后当繁忙更新完成后,属性再次更新UI。

但如果我把

Application.Current.Dispatcher.BeginInvoke((Action)(() =>
                {
                    RollDegrees = (OperationEntity as Level).RollDegrees;

                }));

然后UI完美无缺

为什么会发生这种情况的任何提示?也许在繁忙的更新?或者,当UI Dispatcher已满且忙碌时,这是正常行为吗?

1 个答案:

答案 0 :(得分:0)

所有UI元素都应仅在UI线程中更新。每个线程都有自己的调度程序。如果您需要从非UI线程更新UI,则应调用Application.Current.Dispatcher.BeginInvoke()。因此这是正常的行为。

在第一个场景中,您需要更新属性,但不能更新UI线程。因此,直到UI线程开始执行时才会出现延迟。当您使用Application.Current.Dispatcher.BeginInvoke()时,会立即更新用户界面。

因此,如果您想从不同的线程反映与UI相关的一些更改,请使用Application.Current.Dispatcher.BeginInvoke()

了解更多@ https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.begininvoke(v=vs.110).aspx