Ласкаво просимо до dev.net.ua Увійти | Приєднатися | Допомога

Custom ListView Style, большой источник данных - вопросы производительности

Я захотел сделать свой стиль для ListView - это не так сложно:

    <Style TargetType="{x:Type local:MyListView}">
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility"
                Value="Auto"/>
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility"
                Value="Auto"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:MyListView}">
                    <ScrollViewer>
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </ScrollViewer>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Но возникла проблема - в момент привязки сравнительно большого источника данных (5000 элементов) происходила значительная задержка (4 секунды); при использовании стандартного стиля все работало очень быстро.

После нескольких часов творческого поиска я обнаружил, что проблема решается при помощи свойства ScrollViewer.CanContentScroll следующим образом:

<Setter Property="ScrollViewer.CanContentScroll"
                Value="true"/>


Проблема состояла в том, что при использовании моего стиля ScrollViewer работал в режиме физического (то есть "попиксельного") скроллинга (CanContentScroll == false). Естественно, в этом режиме контейнеру нужно знать суммарную высоту содержимого - на эти измерения (строк) тратилось время при привязке, что и выяснилось при помощи профайлера.

Устанавливая CanContentScroll в true, мы включаем логический ("поэлементный") режим скроллинга. В таком режиме скроллинг происходит в "виртуальной" манере, и измеряется высота только видимых элементов - задержки нет. Заинтересовавшиеся этим вопросом могут исследвать интерфейс IScrollInfo.

Опубліковані Friday, February 15, 2008 5:05 PM від EugeneZ
Помічено як: , , ,

Коментарі

Немає коментарів
Анонімні коментарі деактивовані. Увійдіть або Зареєструйтесь щоб мати доступ до ресурсів Спільноти.