WPF Убедитесь, что RenderTargetBitmap обновил значения привязки из изменений фонового потока

У меня проблема с 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 автоматически отправляет уведомления об изменении свойств в поток пользовательского интерфейса. Как я могу гарантировать, что все эти отправленные уведомления обрабатываются до выполнения рендеринга? Этот код работает нормально, если я удостоверяюсь, что SomeBoundProperty обновляется в потоке Dispatcher, но это далеко не идеально для этого конкретного приложения.

Какие-либо предложения?


person Mike Marynowski    schedule 30.06.2016    source источник


Ответы (1)


Методом проб и ошибок я понял, что уведомления об изменении свойств отправляются с приоритетом DispatcherPriority.Background, поэтому измените строку промывки на это:

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

... похоже, проблема устранилась. DispatcherPriority.ContextIdle на один уровень ниже DispatcherPriority.Backgound. Рендеринг теперь постоянно обновляется.

person Mike Marynowski    schedule 30.06.2016