Windows Phone 7 ListBox имеет плохую производительность всего с несколькими элементами? - PullRequest
0 голосов
/ 25 января 2011

Я пишу простое словарное приложение, которое дает подсказки для слов при вводе текста.Предложения отображаются в виде ListBox , и каждый раз, когда меняется запрос, должно появляться около 10 предложений.

К сожалению, в данный момент производительность низкая.Результаты появляются почти секунду, и я не понимаю, почему. EQATEC Profiler показывает, что мои методы работают без сбоев.Я подтвердил это, поместив Секундомер вокруг моего кода.Я также экспериментировал с количеством предложений, и производительность увеличивается с меньшим количеством элементов.

Это приводит меня к выводу, что отрисовка ListBox (который, как я полагаю, происходит за пределами моих методов) является причиной отсутствия.производительности.

  • Действительно ли рендеринг 10 элементов в ListBox действительно занимает более 250 мс?
  • Как быстро вывести на экран небольшое количество слов?

Edit: способ, которым я заполняю свой ListBox, очень прост.Это правильный путь?

resultsListBox.Items.Clear();
foreach (string s in suggestions.Words)
{
  resultsListBox.Items.Add(s);
}
resultsListBox.SelectedIndex = suggestions.MatchIndex;

То, что вы видите здесь, действительно так: ListBox по умолчанию, элементы String, шаблоны отсутствуют.Нарушаю ли я один из этих принципов?

  • Убедитесь, что у вас есть шаблон данных элемента в контейнере фиксированного размера (сетке).
  • Избегайте / удаляйте, используя сложные конвертеры, когда та же информацияможет быть легко предоставлен объектом данных.
  • Избегать / удалять вложенные структуры, пример списка в элементе списка.
  • Настоятельно рекомендуется не использовать пользовательский элемент управления внутри шаблона данных.
  • Избегайте / удаляйте пользовательские элементы управления из шаблона данных

Ссылка ниже содержит демонстрацию производительности ListBox в простом проекте.

В проекте также показана альтернатива(быстрее) способ отображения списка, используя сетку с кнопками.Этот список нельзя прокручивать, поэтому не является реальным решением .

http://www.mediafire.com/?jypcfm4cs3nvo5c

Не забудьте запустить проект на устройстве, поскольку эмулятор имеет очень разную производительность.Я тестировал его на Samsung Omnia 7.

1 Ответ

4 голосов
/ 25 января 2011

Похоже, вы создаете свой собственный AutoCompleteBox.Есть ли конкретная причина не использовать его в Toolkit ?

Я бы ожидал, что время, необходимое для обновления списка, будет зависеть от: как вы обновляете его;сложность списка;и что-либо еще на странице.
Поскольку вы не предоставили подробности ни о одном из них, возможно, это займет много времени.


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

<ScrollViewer Height="629" Margin="0,139,0,0" Width="480">
    <StackPanel Name="listBox1" />
</ScrollViewer>

cs:

    private void InitializeResultsGrid()
    {
        ...

        for (int i = 0; i < 26; i++)
        {
            ...

            listBox1.Children.Add(new TextBlock());

и

private void SlowFill(string baseStr)
{
    for (int i = 0; i < buttons.Count; i++)
    {
        (listBox1.Children[i] as TextBlock).Text = baseStr + (char)(i + 'a');
    }

Когда я рассчитывал время, это было немного медленнее, чем при использовании Grid, но на LG-E900

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