#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.прошедших миллисекундах