Я разрабатываю приложение для просмотра телепередач для 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.Да, я знаю, это что-то, что нужно исследовать дальше, но сейчас все исправлено.