dotnet / maui

.NET MAUI is the .NET Multi-platform App UI, a framework for building native device applications spanning mobile, tablet, and desktop.
https://dot.net/maui
MIT License
22.22k stars 1.75k forks source link

WinUi CollectionView is not recycling containers. #8151

Open Keflon opened 2 years ago

Keflon commented 2 years ago

Description

The WinUI CollectionView does not recycle item-containers and instead creates a new item-container every time some data scrolls into view.

Steps to Reproduce

Minimum repo:

https://github.com/Keflon/MauiRecycleBug

Steps:

Create a CollectionView
Fill it with items
Scroll up and down in the CollectionView
For the sample, watch the Debug output.

Android

A small number of CollectionItem instances are created and these are recycled.
Example Debug output:
Created CollectionItem. InstanceId: 12. There are 12 instances allocated

WinUI

A new CollectionItem is created every time an instance scrolls into view.
Example Debug output:
Created CollectionItem. InstanceId: 133. There are 133 instances allocated

Scrolling quickly to the end and back (e.g. by dragging the scroll-bar) causes a CRASH

Scrolling slowly can eventually instigate an item being garbage-collected
Example Debug output:
Collected CollectionItem. InstanceId: 9. There are 129 instances allocated

Related: The DataTemplate in the sample code has a CheckBox.

  1. The CheckBox is rendered incorrectly until the Window is resized horizontally.
    1. Should I open a new bug for this?
  2. Having the CheckBox present in the DataTemplate causes a LOT of memory to be consumed, leading to an OutOfMemoryException
    1. Is this a separate bug?

Version with bug

6.0.400 (current)

Last version that worked well

6.0 Release Candidate 3

Affected platforms

Windows

Affected platform versions

Latest

Did you find any workaround?

Note: I can't confirm 100% this worked in the previous release because I don't know how to roll-back, but I'm certain this is a new problem.

Relevant log output

No response

Keflon commented 2 years ago

Addendum:

The CheckBox is rendered incorrectly until the Window is resized horizontally.

If the CheckBox is rendered incorrectly, i.e. the containing Window is not resized horizontally, then dragging the scroll-bar quickly down does not lead to a crash. (Though we still get OutOfMemory rather quickly if we waggle the scroll-bar up and down) Hope that's a useful clue :)

kristinx0211 commented 2 years ago

Can be verified that the above issue exist using above repro project on windows.

ghost commented 2 years ago

We've moved this issue to the Backlog milestone. This means that it is not going to be worked on for the coming release. We will reassess the backlog following the current release and consider this item at that time. To learn more about our issue management process and to have better expectation regarding different types of issues you can read our Triage Process.

homeyf commented 1 year ago

Verified this issue with Visual Studio Enterprise 17.7.0 Preview 3.0. Can repro on Windows platform with sample project. https://github.com/Keflon/MauiRecycleBug demo3

IlyaSemenchenkoIfs commented 1 year ago

I also can reproduce the behavior described here, every time CollectionView, instead of reusing view, creates a new one

Hunv commented 8 months ago

This issue is making me problems since 2015. I think it is the WinUI control that is not working as expected. BUT this issue is also on Android (cannot check iOS). Here is also some sample code: https://stackoverflow.com/questions/31817050/listview-caching-in-windows-ui