2016-11-17 123 views
0

我有這樣的屬性。奇怪的行爲綁定與屬性更改和繁忙的純屬性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調度程序已滿且繁忙時,這是正常行爲?

回答

0

所有UI元素只應在UI線程中更新。每個線程都有自己的調度程序。如果您需要從非UI線程更新UI,請致電Application.Current.Dispatcher.BeginInvoke()。因此這是正常的行爲。

在第一種情況下,您正在更新屬性,但不是從UI線程。因此,直到UI線程開始運行時才引起延遲。當您使用Application.Current.Dispatcher.BeginInvoke()時,UI會立即更新。

所以,如果你想反映一些來自不同線程的UI相關變化,請使用Application.Current.Dispatcher.BeginInvoke()

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

+0

但我讀了WPF marshalls屬性更改爲UI線程。但是當UI線程忙時,這不起作用? – isra60

+0

這就是爲什麼它在UI線程變爲空閒時工作。 – ViVi

+0

所以.. WPF自動編組提出低優先?? ?? – isra60