Будет ли выполнение нескольких изменений свойств подряд, каждый из которых влияет на внешний вид элемента UIElement, одним или несколькими перерисовками?
Скажи у меня есть Canvas
содержащий ребенка Rectangle
, Затем пользователь изменяет размер прямоугольника, потянув верхний левый угол вверх и влево (оставляя нижний правый угол на якоре).
Новая позиция и размер прямоугольника устанавливаются так (квази-код):
Canvas.SetLeft(rectangle, newLeft);
Canvas.SetTop(rectangle, newTop);
rectangle.Width += oldLeft - newLeft;
rectangle.Height += oldTop - newTop;
Будет ли WPF выполнять перерисовку для каждого из этих изменений в позиционировании / размере (т. Е. Будет ли каждое изменение свойства аннулировать задействованные элементы и инициировать перерисовку самостоятельно), или они будут "поставлены в очередь" ("помечены как грязные") и выполнены все сразу в какой-то "следующей перерисовке" (когда бы это ни было)?
Изменить: мне интересно, в какой степени (если таковые имеются) настройки Canvas.Left и Canvas. Top по отдельности представляет избыточный / неэффективный код, из-за множественного InvalidateArrange
звонки сделаны Canvas
в таком сценарии (по сравнению с, скажем, унифицированными методами Canvas.SetTopLeft или Canvas.SetRect). Отчасти это связано с предупреждениями в документации MSDN о том, что "Частые вызовы InvalidateArrange или, в частности, UpdateLayout имеют значительные последствия для производительности".
1 ответ
В общем случае базовое приложение WPF будет иметь один поток. Это означает, что он может делать что-то одно за раз, что также означает, что он не может отображать пользовательский интерфейс, когда читает инструкции из вашего кода. Итак, после того, как он прочитает все инструкции из вашего кода и выполнение программы достигнет конца текущего метода, он перейдет в режим рендеринга для визуализации интерфейса за один проход.
Вот почему пользовательский интерфейс "зависает", когда выполнение программы обрабатывает какую-то долго выполняющуюся задачу, которая не была запущена с использованием фонового потока (я не говорю о вашем коде здесь). Пользовательский интерфейс не будет отвечать до тех пор, пока текущий метод не завершится и выполнение программы не может вернуться к пользовательскому интерфейсу.