ListView, ListViewItems и виртуализация - PullRequest
2 голосов
/ 29 ноября 2010

У меня проблема с виртуализацией пользовательского интерфейса ListView с сотнями элементов, элементы которых могут предоставлять свойство Visibility.

К сожалению, виртуализация не распознает корректную видимость и делает полосу прокрутки меньше или больше в зависимости от того, каксколько элементов находится в ViewPort (а не сколько элементов не свернуто в ViewPort) в позиции прокрутки.

Есть ли способ избежать этой проблемы без отключения виртуализации?

Пожалуйста, смотрите прикрепленный пример:

<ListView VerticalAlignment="Stretch" 
          Name="ListViewControl" 
          HorizontalAlignment="Stretch" 
          ItemsSource="{Binding Movies}" 
          ScrollViewer.VerticalScrollBarVisibility="Visible" 
          SelectedItem="{Binding MovieSelected, Mode=OneWayToSource}">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <EventSetter Event="MouseDoubleClick" Handler="ItemClicked" />
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="Visibility" Value="{Binding Visibility}"/>
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid HorizontalAlignment="Stretch">

            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

1 Ответ

2 голосов
/ 29 ноября 2010

Смысл виртуализации в том, что пользовательский интерфейс может отображаться без необходимости изучения каждого элемента в коллекции, верно? Но желаемый результат зависит именно от этого: полоса прокрутки не может точно рассчитать размер большого пальца, не зная, сколько элементов видно, и для того, чтобы это сделать, необходимо посмотреть на каждый элемент. Когда у вас включена виртуализация, полоса прокрутки просматривает не каждый элемент, а просто использует количество элементов в коллекции в качестве оценки.

Что может быть лучше, чем сворачивать элементы, которые вы не хотите видеть, так это удалять их из источника элементов. Используйте CollectionView и отфильтруйте элементы, у которых Visibility равно Visibility.Collapsed. Вы по-прежнему несете расходы на посещение каждого элемента в базовой коллекции, чтобы определить, должен ли он отображаться в представлении, но, вероятно, это будет немного быстрее, если это будет выполнено перед элементами в коллекции, которые фактически отображаются в пользовательском интерфейсе. 1006 *

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