WP7 ListBoxItem ContentPresenter Измерение времени - PullRequest
0 голосов
/ 19 июня 2011

Надеюсь, кто-нибудь может мне помочь или хотя бы немного просветить меня. После выпуска инструментов бета-версии Mango я много играл с новым WP7 Profiler, и одна вещь меня беспокоит.

Каждый отдельный список с чуть более сложными элементами требует вечного рисования. Например, для списка, в котором есть элемент, состоящий из Border-> Grid-> 6xTextBoxes (каждый показывает один символ), требуется 303 мс на элемент списка. Из них 288 мс тратится на время измерения ContentPresenter объекта ListBoxItem (без учета).

Я знаю, что Мера - это довольно дорогостоящая операция, но все же это безумие. Любые мысли будут оценены.

Ответы [ 2 ]

1 голос
/ 20 июня 2011

Я могу только подтвердить, что MeasureOverride использует наиболее трудоемкую операцию. (И вам не нужен профилировщик, чтобы это выяснить.) Я могу только догадываться, почему это занимает так много времени.

Во-первых, MeasureOverride рекурсивно перемещается по визуальному дереву ListBoxItem. Где-то в конце этой цепочки вызовов, вероятно, есть вызов нативного кода, который возвращает фактический размер.

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

Ваша структура кажется слишком сложной. Если вы посмотрите на шаблон TextBox, вы увидите, что его структура Grid> Border> ContentPresenter. Я не могу судить, что стоит за ContentPresenter, так как я не знаю ваш код, я просто удивляюсь, почему вы не используете TextBlock (где это возможно) - он намного эффективнее.

В качестве эксперимента я бы попытался реализовать MyListBoxItem.MeasureOverride и вернуть фиксированный размер без вызова базовой реализации. Я понятия не имею, работает ли он, но может принести удивительные результаты.

Второе, что вы можете исследовать при реализации собственных элементов списка, - это частота обращений к MeasureOverride. (Или просто посмотрите на вывод профилировщика.) Если количество вызовов слишком велико, то макет может занять больше циклов, чем необходимо. Возможно, существуют противоречивые требования к размерам, для решения которых необходимо выполнить несколько шагов.

Вы упомянули 40 предметов. Это не должно играть никакой роли. ListBox состоит из трех экранов ListBoxItem, остальные элементы создаются (чаще всего используются повторно) по мере необходимости. Если время измерения увеличивается с увеличением номера элемента, ищите проблему в реализации данных.

0 голосов
/ 19 июня 2011
  1. Убедитесь, что ваши данные полностью загружены в асинхронном действии, и только добавление элемента в ListBox выполняется в потоке пользовательского интерфейса

  2. Убедитесь, что вы используете GridStackPanel в вашем шаблоне

Следующая статья также очень полезна:

http://blogs.msdn.com/b/slmperf/archive/2010/10/06/silverlight-for-windows-phone-7-listbox-scroll-performance.aspx

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