Как сохранить виртуализацию, когда стиль ControlTemplate ListBox?

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

Я понимаю, что всякий раз, когда я помещаю ItemsPresenter в другой контейнер, такой как Grid, Border...

<ControlTemplate TargetType="ListBox">
                    <ScrollViewer x:Name="ScrollViewer" 
                                  BorderBrush="{TemplateBinding BorderBrush}" 
                                  BorderThickness="{TemplateBinding BorderThickness}" 
                                  Background="{TemplateBinding Background}" 
                                  Foreground="{TemplateBinding Foreground}" 
                                  Padding="{TemplateBinding Padding}">
                        <StackPanel>
                            <TextBlock Text="{TemplateBinding MyText}" />
                            <ItemsPresenter/>
                        </StackPanel>
                    </ScrollViewer>
</ControlTemplate>

ListBox потеряет свою виртуализацию сразу. Но я хочу разместить TextBlock до ItemsPresenter, и ScrollViewer принимает только 1 дочерний элемент.

Как с этим бороться?

ОБНОВЛЕНИЕ: я вижу этот пост, который Дерек Лэйкин делает, чтобы поместить это TextBlock к ScrollViewer шаблон, но как это можно разместить TextBlock в ScrollContentPresenter?

P / S: я устанавливаю VirtualizingStackPanel как ItemsPanel для меня ListBox,

1 ответ

Решение

Вы создаете шаблон элемента для списка, но важно, чтобы ItemPresenter был прямым потомком средства просмотра прокрутки. Посетите http://msdn.microsoft.com/en-us/library/ms754242.aspx для получения дополнительной информации о том, как шаблонизировать список. Я также нашел эту статью действительно полезной.

Если itempresenter не может быть прямым потомком, вы должны дать ItemsPresenter имя ItemsPresenter.

Другие вопросы по тегам