2016-06-30 3 views
1

Ich habe ein Problem mit RenderTargetBitmap, da ich es nicht konsistent holen kann, nachdem ich gebundene Eigenschaften in einem Hintergrundthread geändert habe.WPF Stellen Sie sicher, dass RenderTargetBitmap aktualisiert wurde Binding-Werte aus Hintergrundthreadänderungen

Hier ist, was ich habe:

 // Update a property on an INotifyPropertyChanged view model 
     // This runs on a background thread 
     viewModel.SomeBoundProperty += 10; 

     // Flush dispatcher queue (from http://stackoverflow.com/a/2596035/612510) 
     _lcd.Dispatcher.Invoke(() => {}, System.Windows.Threading.DispatcherPriority.Loaded); 

     // Render the updated control 
     _lcd.Dispatcher.Invoke(() => 
     { 
      _lcd.Measure(new System.Windows.Size(240, 160)); 
      _lcd.Arrange(new System.Windows.Rect(0, 0, 240, 160)); 
      _lcd.UpdateLayout(); 

      _renderTarget.Render(_lcd); 
     } 

Ach, etwa die Hälfte der Zeit erhalte ich das machen, bevor die Steuerung mit dem neuen Wert aktualisiert wird, und die andere Hälfte es korrekt aktualisiert.

Von was ich verstehe, sendet WPF Property Change Benachrichtigungen automatisch an den UI-Thread. Wie kann ich sicherstellen, dass diese abgesendeten Benachrichtigungen vor dem Rendern verarbeitet werden? Dieser Code funktioniert gut, wenn ich sicherstellen, dass SomeBoundProperty auf dem Dispatcher-Thread aktualisiert wird, aber das ist weniger als ideal für diese bestimmte Anwendung.

Irgendwelche Vorschläge?

Antwort

0

Einiger Versuch und Irrtum hat mich herauszufinden, dass Eigenschaft Änderungsbenachrichtigungen an der Priorität DispatcherPriority.Background versandt werden, so die Spülleitung an diese Veränderung:

// Flush dispatcher queue 
_lcd.Dispatcher.Invoke(() => {}, System.Windows.Threading.DispatcherPriority.ContextIdle); 

... sieht aus wie es das Problem behoben. DispatcherPriority.ContextIdle ist eine Ebene unter DispatcherPriority.Backgound. Der Render wird jetzt jedes Mal konsistent aktualisiert.

Verwandte Themen