ListView с непрерывным заполнением не виртуализируется - PullRequest
3 голосов
/ 06 декабря 2011

Я изменил шаблон элемента управления моего ListView, чтобы он выглядел следующим образом:

<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
    <ScrollViewer Background="{TemplateBinding Background}"
                      VerticalScrollBarVisibility="Auto"
                      Padding="{TemplateBinding Padding}" Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}"
                  VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"
                  ScrollViewer.IsDeferredScrollingEnabled="True">
        <StackPanel>
            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
            <Border x:Name="FillerView" BorderThickness="0"/>
        </StackPanel>

    </ScrollViewer>
</Border>

Причина этого в том, что я хочу, чтобы переменная окраска ListView продолжалась.Это делается с помощью триггера для границы FillerView.Если я уберу Stackpanel и границу Fillerview из этого шаблона, мой ListView будет виртуализироваться нормально и очень быстро.Если он у меня есть, он невероятно медленный.

Может кто-нибудь сказать мне, почему виртуализация не работает, когда я использую шаблон выше?О, и я не могу переместить Границу FillerView из Scrollviewer, потому что я хочу, чтобы нижняя полоса прокрутки была ниже заполнителя.

Спасибо!

1 Ответ

2 голосов
/ 06 декабря 2011

Виртуализация не работает, потому что виртуализация требует, чтобы ItemsPanel ItemsPresenter измерялся с фактическим доступным размером. В вашем случае у вас есть StackPanel в качестве содержимого ScrollViewer, и это будет IScrollInfo для ScrollViewer. Теперь, поскольку StackPanel измеряет свои дочерние элементы с бесконечностью в направлении расположения, это означает, что он будет измерять ваш ItemsPresenter с бесконечной высотой, так что для ItemsPanel (которая будет дочерним элементом ItemsPresenter) будет невозможно узнать фактическую доступную высоту поэтому он не мог виртуализироваться.

Я не уверен, что вы имеете в виду под чередованием окраски списка. Если вы говорите о чередующемся фоне элементов в списке, то обычно следует использовать AlternationConverter .

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