【问题标题】:WPF Ensure RenderTargetBitmap has updated Binding values from background thread changesWPF 确保 RenderTargetBitmap 已从后台线程更改更新绑定值
【发布时间】:2016-06-30 14:30:33
【问题描述】:

我在使用 RenderTargetBitmap 时遇到问题,因为在我更改后台线程上的绑定属性后,我无法让它始终获取更新的渲染。

这是我所拥有的:

        // 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);
        }

唉,大约一半的时间在控件更新为新值之前获得渲染,另一半则正确更新。

据我了解,WPF 会自动向 UI 线程分派属性更改通知。如何确保在渲染之前处理完这些发送的通知?如果我确保在 Dispatcher 线程上更新 SomeBoundProperty,则此代码可以正常工作,但这对于此特定应用程序来说不太理想。

有什么建议吗?

【问题讨论】:

    标签: wpf data-binding rendertargetbitmap


    【解决方案1】:

    经过反复试验,我发现属性更改通知是以DispatcherPriority.Background 优先级发送的,因此将刷新行更改为:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多