ListView és GridView adatvirtualizálás

Megjegyzés
További részletekért lásd a //build/ munkamenetet, amely jelentősen növeli a teljesítményt, amikor a felhasználók nagy mennyiségű adatot használnak a GridView-ban és a ListView-ban.

A ListView és a GridView teljesítményének és indítási idejének javítása adatvirtualizálással. Az elemek felhasználói felületi virtualizálásával, elemcsökkentésével és fokozatos frissítésével kapcsolatban lásd: A ListView és a GridView teljesítményének optimalizálása a WinUI-hoz.

Olyan adathalmazokhoz van szükség adatvirtualizálási módszerre, amelyek olyan nagyok, hogy egyszerre nem vagy nem tárolhatók a memóriában. Betölt egy kezdeti részt a memóriába (helyi lemezről, hálózatról vagy felhőből), és felhasználói felületi virtualizálást alkalmaz erre a részleges adatkészletre. Később igény szerint növekményesen vagy a főadatkészlet tetszőleges pontjairól (véletlenszerű hozzáféréssel) tölthet be adatokat. Az, hogy az adatvirtualizálás megfelelő-e Önnek, számos tényezőtől függ.

  • Az adatkészlet mérete
  • Az egyes elemek mérete
  • Az adatkészlet forrása (helyi lemez, hálózat vagy felhő)
  • A WinUI-alkalmazás teljes memóriahasználata

Megjegyzés Vegye figyelembe, hogy a ListView és a GridView esetében alapértelmezés szerint engedélyezve van egy funkció, amely ideiglenes helyőrző vizualizációkat jelenít meg, miközben a felhasználó gyorsan pásztázó vagy görgető. Az adatok betöltésekor ezek a helyőrző vizualizációk lecserélődnek az elemsablonra. A funkció kikapcsolásához állítsa a ListViewBase.ShowsScrollingPlaceholders függvényt hamisra, de ha így tesz, javasoljuk, hogy az x:Phase attribútum használatával fokozatosan renderelje az elemsablon elemeit. Lásd: ListView és GridView elemek frissítése fokozatosan.

Az alábbiakban további részleteket talál a növekményes és véletlenszerű hozzáférésű adatvirtualizálási technikákról.

Növekményes adatvirtualizálás

A növekményes adatvirtualizálás egymás után tölti be az adatokat. A növekményes adatvirtualizálást használó ListView egy millió elemből álló gyűjtemény megtekintésére használható, de kezdetben csak 50 elem töltődik be. Amikor a felhasználó pásztáz vagy görget, a következő 50 betöltődik. Az elemek betöltésekor a görgetősáv hüvelykujja csökken a méretben. Az ilyen típusú adatvirtualizáláshoz egy adatforrásosztályt kell írnia, amely implementálja ezeket a felületeket.

Az ilyen adatforrások memóriabeli listák, amelyek folyamatosan bővíthetők. Az elemvezérlő a szabványos IList-indexelőt és a darabszámtulajdonságokat használó elemeket fogja kérni. A darabszámnak helyileg kell jelölnie az elemek számát, nem pedig az adathalmaz valódi méretét.

Amikor az elemvezérlő a meglévő adatok végéhez közeledik, meghívja az ISupportIncrementalLoading.HasMoreItems parancsot. Ha igaz értéket ad vissza, akkor meghívja az ISupportIncrementalLoading.LoadMoreItemsAsync parancsot, és egy ajánlott számú betöltendő elemet ad át. Attól függően, hogy honnan tölt be adatokat (helyi lemezről, hálózatról vagy felhőből), dönthet úgy, hogy a javasoltnál eltérő számú elemet tölt be. Ha például a szolgáltatás 50 tételből álló kötegeket támogat, de az elemvezérlő csak 10-et kér, akkor betölthet 50-et. Töltse be az adatokat a háttérrendszerből, adja hozzá a listához, és az INotifyCollectionChanged vagy az IObservableVector<T> segítségével hozzon létre értesítést a változásról, hogy az elemek vezérlője tisztában legyen az új elemekkel. A ténylegesen betöltött elemek számát is kell visszaadni. Ha a javasoltnál kevesebb elemet tölt be, vagy ha az elemvezérlő a köztes időszakban még tovább pásztázott vagy görgetett, akkor az adatforrást ismét meghívja a rendszer további elemekért, és a ciklus folytatódik. Az ISupportIncrementalLoading továbbra is elérhető marad a Windows App SDK-ban, így ugyanazt a növekményes betöltési mintát használhatja egy WinUI-alkalmazásban.

Véletlenszerű hozzáférési adatok virtualizálása

A véletlenszerű hozzáférési adatok virtualizálása lehetővé teszi az adathalmaz tetszőleges pontjáról való betöltést. A véletlenszerű hozzáférésű adatvirtualizálást használó ListView egy millió elemből álló gyűjtemény megtekintéséhez 100 000–100 050 elemet tölthet be. Ha a felhasználó ezután a lista elejére kerül, a vezérlő betölti az 1–50. elemet. A görgetősáv hüvelykujja mindig azt jelzi, hogy a ListView egymillió elemet tartalmaz. A görgetősáv hüvelykujjának pozíciója ahhoz képest van, ahol a látható elemek a gyűjtemény teljes adatkészletében találhatók. Ez az adatvirtualizálás jelentősen csökkentheti a gyűjtemény memóriaigényét és betöltési idejét. Az engedélyezéshez meg kell írnia egy adatforrásosztályt, amely igény szerint lekéri az adatokat, felügyel egy helyi gyorsítótárat, és implementálja ezeket a felületeket.

Az IItemsRangeInfo információt nyújt arról, hogy a vezérlő mely elemeket használja aktívan. Az elemek vezérlője ezt a metódust hívja meg, amikor a nézete változik, és ebbe a két tartománycsoportba tartozik.

  • A nézetportban található elemek készlete.
  • Előfordulhat, hogy a vezérlő által használt nem virtualizált elemek nem szerepelnek a nézetportban.
    • A nézetablakban lévő elemek puffere, amelyet az elemek vezérlője tart, hogy az érintéses pásztázás zökkenőmentes legyen.
    • A fókuszált elem.
    • Az első elem.

Az IItemsRangeInfo implementálásával az adatforrás tudja, hogy milyen elemeket kell lekérni és gyorsítótáraznia, és mikor kell kimetszeni az adatokat a már nem szükséges gyorsítótárból. Az IItemsRangeInfoItemIndexRange objektumokkal írja le a gyűjteményben lévő indexük alapján egy elemkészletet. Ezzel elkerülheti az elemhivatkozásokat, amelyek nem feltétlenül helyesek vagy stabilak. Az IItemsRangeInfo úgy lett kialakítva, hogy csak egy elemvezérlő egyetlen példánya használja, mert az adott elemvezérlő állapotadataira támaszkodik. Ha több elemvezérlőnek is hozzá kell férnie ugyanazokhoz az adatokhoz, akkor mindegyikhez külön adatforráspéldányra van szükség. Megoszthatnak egy közös gyorsítótárat, de a gyorsítótárból való törlés logikája bonyolultabb lesz. Az IItemsRangeInfo továbbra is elérhető marad a Windows App SDK-ban, így ugyanazok a véletlenszerű hozzáférésű gyorsítótárazási technikák érvényesek a WinUI-vezérlőkre.

Íme a véletlenszerű hozzáférésű adatvirtualizálási adatforrás alapstratégiája.

  • Amikor egy elemet kérnek
  • (Opcionálisan) az elemek vezérlőjének nézetváltozásai során az IItemsRangeInfo implementálásával azonosíthatja, hogy milyen elemekre van szükség az adatforrásból.

Ezen túl az, hogy mikor töltsön be adatelemeket, hányat töltsön be, és mely elemeket tartson a memóriában, az alkalmazásra van bízva. Néhány általános szempont, amit szem előtt kell tartani:

  • Aszinkron adatkérések létrehozása; ne tiltsa le a felhasználói felületi szálat.
  • Találja meg az optimális pontot a lehívott kötegek méretében. Preferálja a tömörséget a részletességgel szemben. Nem olyan kicsi, hogy túl sok kis kérést intéz; nem olyan nagy, hogy túl sokáig tart lekérni.
  • Fontolja meg, hogy egyszerre hány kérelem legyen függőben. Az egyes műveletek végrehajtása egyszerűbb, de túl lassú lehet, ha a fordulási idő magas.
  • Meg tudja szüntetni az adatkéréseket?
  • Üzemeltetett szolgáltatás használata esetén van tranzakciónkénti költség?
  • Milyen típusú értesítéseket biztosít a szolgáltatás a lekérdezés eredményeinek módosításakor? Tudni fogja, hogy egy elem be van-e szúrva a 33-as indexbe? Ha a szolgáltatás támogatja a kulcs-plusz eltoláson alapuló lekérdezéseket, az jobb lehet, mint egy index használata.
  • Milyen okosan szeretne elővenni elemeket? Megpróbálja nyomon követni a görgetés irányát és sebességét, hogy előre jelezhesse, mely elemekre van szükség?
  • Mennyire agresszívan szeretné kiüríteni a gyorsítótárat? Ez a memória és a tapasztalat kompromisszuma.