WPF ListView на портативном устройстве - чрезвычайно медленная прокрутка - PullRequest
0 голосов
/ 28 августа 2009

У меня есть GridView в ListView, содержащийся в элементе ScrollViewer.

Я понимаю, что WPF рисует только видимые данные во время выполнения, например, на сетках с прокруткой изначально рисуются только видимые строки - моя проблема в том, что у меня нет такой большой мощности, как на рабочем столе на переносном устройстве, которое я разрабатываю для, поэтому мой WPF ListView - который хорошо прокручивается на моем рабочем столе - очень медленный на портативном устройстве, что делает страницу непригодной для использования (у меня есть только smt как 15 скрытых строк).

Есть ли какой-нибудь грязный хак, который я могу использовать, чтобы обойти проблему (например, прокрутить весь путь вниз, а затем вернуться назад, как только страница загрузится или похожая)?

Есть еще какие-нибудь хакерские идеи? Я что-то не так делаю?

Любая помощь приветствуется!

EDIT: Независимо от того, как мало количество строк (несколько скрытых строк, 3-4), приложение застревает на некоторое время, как только я пытаюсь прокрутить.

РЕДАКТИРОВАТЬ: это мой XAML (удалены стили для ясности):

<ScrollViewer Name="scrollViewer" Grid.Row="1">
        <ScrollViewer.Resources>
                <sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">60</sys:Double>
        </ScrollViewer.Resources>
        <ListView Name="recordContainer" Grid.Row="1" VirtualizingStackPanel.IsVirtualizing="False" ItemsSource="{Binding RecordCollection}">
            <ListView.View>
                <GridView>
                  <GridViewColumn Header="field1" DisplayMemberBinding="{Binding myField_1}"/>
                  <GridViewColumn Header="field2" DisplayMemberBinding="{Binding myField_2}"/>
                </GridView>
            </ListView.View>
        </ListView>
</ScrollViewer>

Ответы [ 5 ]

3 голосов
/ 03 сентября 2009

Первое, что мне нужно отметить, это то, что WPF рендерит с использованием DirectX. Если DirectX недоступен, система автоматически по умолчанию использует программное средство рендеринга (что намного медленнее).

Теперь, если DirectX доступен (что справедливо для всех полноценных компьютеров, но не для «портативных устройств»), следующая проблема, с которой вы столкнулись, - это мощность вашей видеокарты (или чипа).

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

Теперь, ваши стили сложны? или у них много работы по рендерингу? (т.е. сложные градиенты). Если это так, возможно, вы могли бы подумать об уменьшении (или исключении) их из приложения, когда оно выполняется на вашем портативном устройстве.

WPF предоставляет хороший способ определить, способен ли аппарат, на котором выполняется программное обеспечение, справляться с нагрузкой.

Код будет:

int RenderTier = (RenderCapability.Tier >> 16);

Теперь, если RenderTier == 0, то у вас есть видеокарта (или чип), которая не может обеспечить аппаратное ускорение, поэтому весь рендеринг будет выполняться с использованием программного средства рендеринга WPF (на ЦП).

Если RenderTier == 1, то у вас есть частичное ускорение. Некоторые операции будут выполняться на видеокарте, другие - на процессоре

если RenderTier == 2, у вас полное аппаратное ускорение, весь рендеринг будет выполняться на видеокарте.

1 голос
/ 03 сентября 2009
0 голосов
/ 01 сентября 2009

Если вам нужно создавать элементы при загрузке и не позволять панели виртуализации создавать их при прокрутке списка пользователями, просто установите для свойства VirtualizingStackPanel.IsVirtualizing значение false:

<ListView VirtualizingStackPanel.IsVirtualizing="False">
</ListView>

Что касается DataGrid и производительности ListView. Мы обнаружили, что время рендеринга первого неприемлемо для нашего проекта, и решили написать собственный элемент управления сеткой на основе ListView. Разница в производительности была огромной: от ср. За 300 мс DataGrid мы получили ~ 80 мс от ListView ...

0 голосов
/ 01 сентября 2009

Не устанавливайте для свойства ScrollbarVisibility значение "Auto", что может снизить производительность. Вместо этого установите значение "Visible", "Disabled" или "Hidden" (в вашем случае, вероятно, "Visible").

0 голосов
/ 28 августа 2009

Я не уверен, что это решит проблему, но вы можете попробовать использовать VirtualizingPanel

...