Подтвердить что ты не робот

WPF ListView Очень медленная производительность - почему? (ElementHost или другая причина?)

У меня есть приложение 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 частью дерьма? (btw, те же результаты с WPFToolkit DataGrid)?

4b9b3361

Ответ 1

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

<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> 

Ответ 2

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

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

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

Ответ 3

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