WPF确保RenderTargetBitmap已更新后台线程更改中的Binding值

时间:2016-06-30 14:30:33

标签: wpf data-binding rendertargetbitmap

我遇到了RenderTargetBitmap的问题,因为我在后台线程上更改绑定属性后无法一致地获取更新的渲染。

这就是我所拥有的:

public class MyClass : DropCreateDatabaseAlways<connectionstringContextName>
{
     protected override void Seed(MyContext context)
     {
         // Your seed data
     }
}

唉,大概有一半的时间我在使用新值更新控件之前获取渲染,而另一半则正确更新。

根据我的理解,WPF会自动将属性更改通知发送到UI线程。在执行渲染之前,如何确保这些已分派的通知都已处理完毕?如果我确保在Dispatcher线程上更新 // 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); } ,则此代码可以正常工作,但这对于此特定应用程序来说不太理想。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我试图通过DispatcherPriority.Background优先级调度属性更改通知进行一些反复试验,因此将刷新线更改为:

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

......看起来它解决了这个问题。 DispatcherPriority.ContextIdleDispatcherPriority.Backgound低一级。渲染现在每次都会更新。