Как записать время рисования экрана

#c# #wpf

#c# #wpf

Вопрос:

Я пытаюсь выяснить, как зафиксировать, DateTime когда UserControl объект, содержащий сетку, перерисовывается в приложении WPF MVVM. Я поместил этот блок кода ниже в коде, который вызывается при рендеринге запуска приложения, я также добавил LayoutUpdated событие в пользовательский элемент управления. Должен ли я больше сосредоточиться на событиях сетки? Правильно ли я это понимаю? Есть ли какой-либо другой способ зафиксировать, когда UserControl перерисовывается?

 this.Dispatcher.Be&inInvoke(DispatcherPriority.Render, new Action(() =&&t;
{
   this.SetRequestResponseTime();
}));
  

Комментарии:

1. Я бы поэкспериментировал как с layoutupdated, так и с sizechan&ed. Я думаю, вы также хотите, чтобы actualhei&ht и actualwidth были числом, большим нуля, чтобы получить конечные события. Я бы просто обработал это и посмотрел, что произойдет. Хотя ваше требование кажется немного странным. Чего вы пытаетесь достичь?

2. Чего я пытаюсь достичь, так это измерить, когда поступают данные, сколько времени требуется для отображения на экране или как я понимаю это рисование. Я не делаю анимацию или изменение размера, поэтому я не уверен, что изменение ширины или высоты что-нибудь даст. Прямо сейчас я экспериментирую с layoutupdated для сетки

3. Судя по вашему описанию, я думаю, что простейшим подходом была бы просто отсрочка через диспетчера.

4. диспетчер, который у меня есть, находится в конструкторе кода, лежащего в основе представления, когда он загружается или визуализируется, я запускаю действие, но он никогда ничего не делает, когда происходит обновление.

5. Вы прочитали мой ответ? Вы получаете данные, запускаете секундомер, планируете остановку секундомера и устанавливаете свойства или что бы вы ни делали. И вы делаете это везде, где устанавливаете данные. Также. Обратите внимание, что мой код не совпадает с вашим.

Ответ №1:

Способ, которым я бы подошел к этому, был бы:

Когда вы получите данные. Создайте и запустите секундомер.

Запланируйте остановку секундомера в диспетчере:

  Stopwatch sw = Stopwatch.StartNew();
 Application.Current.Dispatcher.InvokeAsync(new Action(() =&&t; 
 {  
     sw.Stop();
 }), DispatcherPriority.ContextIdle);
//Set data
  

Представьте данные в пользовательский интерфейс. Установите свойства или что бы вы ни делали.

Поскольку остановка секундомера откладывается при низком приоритете диспетчера, это будет выполняться после завершения любых привязок и компоновки.

Затем у вас должен быть требуемый промежуток времени в sw.прошедших миллисекундах