WP7: Когда ListBox использует VirtualizingStackPanel? - PullRequest
1 голос
/ 08 апреля 2011

Все говорят, что по умолчанию ItemsPanel для ListBox это VirtualizingStackPanel.Я создал класс, производный от ListBox (назовите его MyListBox), и вместо него по умолчанию используется StackPanel.

Я имею в виду, что мне нужно принудительно запустить виртуализацию, например, так:

const string itemsPanelTemplateString = @"
<ItemsPanelTemplate
xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" >
<VirtualizingStackPanel/>
</ItemsPanelTemplate>";

MyListBox {
    this.ItemsPanel = (ItemsPanelTemplate)
        System.Windows.Markup.XamlReader.Load(itemsPanelTemplateString);
}

Я мог быперепечатайте здесь мой класс, но это не главное.Я хотел бы знать общий ответ.

Класс не меняет предопределенный стиль ListBox, но использует собственный класс, производный от ListBoxItem.

Я почти уверен, что существуют некоторые условия для использования виртуализации,как сказал мой коллега, он видел соответствующий код ListBox в прошлом.К сожалению, сейчас у нас нет доступа к отладочным версиям MS DLL.

Ответы [ 4 ]

1 голос
/ 11 апреля 2011

решаемая.Это была моя ошибка:

При переопределении ListBox.OnApplyTemplate () (с целью измерения времени) я забыл вызвать base.OnApplyTemplate ().Видимо, выбор панели элементов сделан там.

Опасная ошибка, потому что все вроде бы работает.

Спасибо всем, кто пытался помочь.

1 голос
/ 09 апреля 2011

ListBox и элементы управления, полученные из ListBox, будут иметь VirtualizedStackPanel в качестве ItemsPanel по умолчанию, если пользовательский код не изменяет ее явно.

Однако, если ваш пользовательский ListBox получен непосредственно из ItemsControl (в отличие от фактического вывода из ListBox), то вы получите StackPanel в качестве ItemsPanel по умолчанию.

Может ли это быть в вашем коде? Если нет, пожалуйста, поделитесь своим контрольным кодом.

0 голосов
/ 08 апреля 2011

Хорошие рекомендации по улучшению производительности Listbox можно найти на http://blogs.msdn.com/b/slmperf/archive/2010/10/06/silverlight-for-windows-phone-7-listbox-scroll-performance.aspx

. Также есть хорошая альтернатива, документированная на http://blogs.msdn.com/b/delay/archive/2010/09/08/never-do-today-what-you-can-put-off-till-tomorrow-deferredloadlistbox-and-stackpanel-help-windows-phone-7-lists-scroll-smoothly-and-consistently.aspx

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

0 голосов
/ 08 апреля 2011

Стиль по умолчанию для ListBox не назначает шаблон ItemsPanel.

В соответствии с внутренним кодом, который я вижу в отражателе, OnApplyTemplate назначит VirtualizingStackPanel внутреннему ItemsHost, если *Шаблон 1006 * не поставляется.

Возможно, включение кода вашего класса может быть хорошей идеей.

...