WPF - Панель, кажется, загружает все элементы одновременно - PullRequest
0 голосов
/ 28 марта 2020

Я хочу показать 2000 элементов с изображением (миниатюра).

Если я использую обычный просмотр списка, он будет занимать около 2 ГБ памяти при виртуализации пользовательского интерфейса. Поэтому я попытался решить эту проблему с помощью виртуализации данных с последующим [https://github.com/lvaleriu/Virtualization]. Идея состоит в том, чтобы загрузить только страницу элементов. Когда мы прокручиваем вниз до доступа более чем к половине страницы, запрашивается новая страница. Следовательно, только несколько страниц хранятся в памяти, и потребляемая память составляет около 150 МБ.

Все хорошо, пока я не хочу отображать элементы в виде сетки (например, с помощью панели переноса или унифицированной оболочки). Проблема в том, что все страницы запрашиваются в начале, что приводит к использованию 2 ГБ памяти. Я немного разбираюсь, и проблема может быть на панели предметов. Он пытается загрузить все данные, чтобы найти элемент, и именно этого я и стараюсь избегать.

Кто-нибудь сталкивался с подобной проблемой? Можете ли вы помочь мне разобраться?

Спасибо за продвинутый

<ListView ItemsSource="{Binding}" VirtualizingPanel.IsVirtualizing="True"
            VirtualizingPanel.VirtualizationMode="Recycling"
            ScrollViewer.IsDeferredScrollingEnabled="True">
    <!-- Problem when I add this part-->
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel></WrapPanel>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
    <!-- End -->
    <ListView.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="MinWidth" Value="200"/>
            <Setter Property="MaxWidth" Value="250"/>
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.ItemTemplate>
        <DataTemplate>
            <DockPanel LastChildFill="True" MinWidth="200" MaxWidth="250">
                <TextBlock TextWrapping="WrapWithOverflow" Text="{Binding Data.FullPath}" 
                    TextAlignment="Center" DockPanel.Dock="Bottom" Width="auto"/>
                <Image Source="{Binding Data.FullPath, Converter={local:FileToIconConverter}}"
                DockPanel.Dock="Top" MaxHeight="200"/>
            </DockPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Код виртуализации данных можно найти в [https://github.com/lvaleriu/Virtualization] . Я не буду публиковать здесь, так как это немного сложно.

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