WPF 确保 RenderTargetBitmap 已更新来自后台线程更改的绑定值
WPF Ensure RenderTargetBitmap has updated Binding values from background thread changes
我在使用 RenderTargetBitmap 时遇到问题,因为在后台线程上更改绑定属性后,我无法始终如一地获取更新的渲染。
这是我的资料:
// Update a property on an INotifyPropertyChanged view model
// This runs on a background thread
viewModel.SomeBoundProperty += 10;
// Flush dispatcher queue (from
_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);
}
唉,大约一半的时间我在用新值更新控件之前获得渲染,而另一半它正确更新。
据我了解,WPF 会自动将 属性 更改通知分派给 UI 线程。如何确保在进行渲染之前处理完这些已发送的通知?如果我确保 SomeBoundProperty
在 Dispatcher 线程上更新,此代码工作正常,但这对于这个特定应用程序来说不太理想。
有什么建议吗?
一些尝试和错误让我发现 属性 更改通知以 DispatcherPriority.Background
优先级发送,因此将刷新行更改为:
// Flush dispatcher queue
_lcd.Dispatcher.Invoke(() => {}, System.Windows.Threading.DispatcherPriority.ContextIdle);
...看起来问题已解决。 DispatcherPriority.ContextIdle
比 DispatcherPriority.Backgound
低一级。渲染现在每次都一致更新。
我在使用 RenderTargetBitmap 时遇到问题,因为在后台线程上更改绑定属性后,我无法始终如一地获取更新的渲染。
这是我的资料:
// Update a property on an INotifyPropertyChanged view model
// This runs on a background thread
viewModel.SomeBoundProperty += 10;
// Flush dispatcher queue (from
_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);
}
唉,大约一半的时间我在用新值更新控件之前获得渲染,而另一半它正确更新。
据我了解,WPF 会自动将 属性 更改通知分派给 UI 线程。如何确保在进行渲染之前处理完这些已发送的通知?如果我确保 SomeBoundProperty
在 Dispatcher 线程上更新,此代码工作正常,但这对于这个特定应用程序来说不太理想。
有什么建议吗?
一些尝试和错误让我发现 属性 更改通知以 DispatcherPriority.Background
优先级发送,因此将刷新行更改为:
// Flush dispatcher queue
_lcd.Dispatcher.Invoke(() => {}, System.Windows.Threading.DispatcherPriority.ContextIdle);
...看起来问题已解决。 DispatcherPriority.ContextIdle
比 DispatcherPriority.Backgound
低一级。渲染现在每次都一致更新。