WPF ListView Очень низкая производительность - почему? (ElementHost или другая причина?) - PullRequest
22 голосов
/ 17 ноября 2008

У меня есть приложение Windows Forms, в котором есть один ElementHost, содержащий WPF UserControl ... в моем WPF у меня ОЧЕНЬ простой ListView:

<ListView Margin="4" ItemsSource="{Binding Notifications}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding FirstName}" />
            <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding LastName}" />
            <GridViewColumn Header="Address" DisplayMemberBinding="{Binding Address}" />
            <GridViewColumn Header="City" DisplayMemberBinding="{Binding City}" />
            <GridViewColumn Header="State" DisplayMemberBinding="{Binding State}" />
            <GridViewColumn Header="Zip" DisplayMemberBinding="{Binding Zip}" />
        </GridView>
    </ListView.View>
</ListView>

Если в моем источнике 10 элементов, форма загружается менее чем за одну секунду. Если у моего источника 1000 предметов, это займет 7 секунд !!! Мой таймер учитывает ТОЛЬКО загрузку (а не сколько времени требуется, чтобы получить предметы).

Итак, мой вопрос:

Является ли использование ElementHost кошмаром производительности?

Является ли WPF DataBinding производительным кошмаром?

Является ли ListView дерьмом? (кстати, те же результаты с DataGrid WPFToolkit)?

Ответы [ 3 ]

28 голосов
/ 17 ноября 2008

Использовать виртуализацию

<ListView ItemsSource="{BindingNames}"Name="lv">
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                   <!--<StackPanel/>
                    If StackPanel was used, the memory consumed was over 2GB and dead slow.
                    -->
                   <VirtualizingStackPanel>
                    <!--Memory footprint is only 200 mb-->
                    </VirtualizingStackPanel>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView> 
12 голосов
/ 07 апреля 2009

Вы также можете проверить эту отличную статью о проекте кода:

WPF: виртуализация данных Пол МакКлин http://www.codeproject.com/KB/WPF/WpfDataVirtualization.aspx

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

0 голосов
/ 16 января 2019

У меня был случай, когда представленные здесь ответы не решили мою проблему. В моем случае установка свойства MaxHeight для ListView на значение, превышающее фактическую отображаемую высоту, сразу же решила его, благодаря этому ответу , даже если я не могу объяснить, как и почему он работал .

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