Pivot со многими PivotItems - PullRequest
       22

Pivot со многими PivotItems

1 голос
/ 31 августа 2011

Я разрабатываю приложение для просмотра телепередач для WP7, но у меня возникают проблемы с элементом управления Pivot: сначала я попытался добавить все доступные каналы EPG, но производительность крайне низкая (даже на реальном телефоне),~ 10-15 секунд, чтобы добавить 25 пустых PivotItems, без каких-либо данных или элементов управления.

Итак, я протестировал динамический / ленивый подход, ориентированный на загрузку, который загружает сначала только три элемента, а затем добавляет одинбольше каждый раз, когда пользователь проводит пальцем влево или вправо.Проблема заключается в том, что при перемещении влево новый элемент толкает текущий элемент в коллекции данных на один слот вправо, создавая грязный рендеринг на экране: , что неудивительно, поскольку SelectedIndex не изменяется, а выбранный элемент .Однако исправление SelectedIndex делает ситуацию еще хуже, в результате чего Pivot застревает в несогласованном макете.

Вот код:

    public void ChangeChannel(){

        if (index < 0) return;
        int i = index;
        int tot = Epg.Channels.Count;
        int slack = (i == 0) ? -1 : i > oldIndex ? 1 : -1;

        var ch = this.Channels[i];
        var nextIndex = (ch.ChannelIndex + slack) % tot;
        if (nextIndex < 0) nextIndex += tot;

        var next = Epg.Channels[nextIndex];
        if (!this.Channels.Contains(next))
        {
            if (slack < 0)
            {
                this.Channels.Insert(0, next);
                //Index++;
            }
            else
                this.Channels.Add(next);
        }

        oldIndex = i;
    }

Метод связан с Pivot.LoadingPivotItem с помощью Caliburn.Микро. index привязан к Pivot.SelectedIndex, Epg.Channels является основным объектом модели, а this.Channels является ObservableCollection, привязанным к Pivot.ItemsSource

РЕДАКТИРОВАТЬ: нашел хитрость. Я стал подозрительным, когда вспомнил, что у меня есть приложение для чтения RSS, которое имеет Pivot с не менее чем 10-12 вкладками, работающими очень быстро.Тем не менее, я создал небольшое тестовое приложение, работающее аналогично, но без использования Caliburn.О, это какое-то представление!Но Калибурн такой тяжелый?Не совсем, так как я обнаружил этот маленький кусочек кода в AppBootstrapper по умолчанию:

            ConventionManager.AddElementConvention<Pivot>(Pivot.ItemsSourceProperty, "SelectedItem", "SelectionChanged").ApplyBinding =
            (viewModelType, path, property, element, convention) =>
            {
                if (ConventionManager
                    .GetElementConvention(typeof(ItemsControl))
                    .ApplyBinding(viewModelType, path, property, element, convention))
                {
                    ConventionManager
                        .ConfigureSelectedItem(element, Pivot.SelectedItemProperty, viewModelType, path);
                    ConventionManager
                        .ApplyHeaderTemplate(element, Pivot.HeaderTemplateProperty, viewModelType);
                    return true;
                }

                return false;
            };

Удаление его повышает производительность без необходимости выхода из Caliburn.Да, я знаю, это что-то, что нужно исследовать дальше, но сейчас все исправлено.

Ответы [ 2 ]

3 голосов
/ 31 августа 2011

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

Если выдействительно нужно использовать сводную диаграмму, чтобы показать большое количество элементов, вы можете сделать это, создав экземпляр всего с 3 элементами в нем и обновив привязки каждого элемента при изменении выбранного элемента.Цель состоит в том, чтобы заполнить элементы по обе стороны от той, которая отображается в данный момент.Логика может немного запутаться (зависит от выбранного в данный момент элемента и ранее отображаемого элемента, обновить другую привязку), но это выполнимо.

0 голосов
/ 01 сентября 2011

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

Я когда-то создал читатель комиксов таким образом. Это очень просто и не влияет на производительность.

...