.NET 8下Blazor QuickGrid滚动闪烁抖动问题求助
结合你提到的.NET 6正常、启用虚拟化、使用ItemsProvider远程数据这几个前提,问题大概率出在.NET 8对QuickGrid虚拟化及数据加载逻辑的更新上,具体分析如下:
可能的故障原因
虚拟化计算逻辑的版本差异
.NET 8对Blazor虚拟化组件的滚动位置判定、可视区域计算逻辑做了调整,和.NET 6的实现存在明显差异。当ItemsProvider配合虚拟化使用时,QuickGrid依赖的Virtualize组件在滚动触发时,可能因为新的计算逻辑误判了可视区域边界,尤其是远程数据加载存在延迟时,组件可能在数据未返回前就重新计算滚动位置,直接导致Skip值被错误重置为0,进而引发滚动抖动。ItemsProvider异步加载状态处理不兼容
.NET 8中QuickGrid对ItemsProvider的异步加载状态处理逻辑有更新,如果你的ItemsProvider实现未正确维护加载状态——比如返回的ItemsProviderResult中TotalItemCount不准确、或者加载过程中未正确同步状态——组件会因为无法正确感知数据总量,导致滚动位置计算混乱,出现Skip值重置和滚动闪烁。而.NET 6版本的组件对这类状态问题容错性更高,不会触发异常。虚拟化滚动锚定机制适配问题
.NET 8新增了虚拟化组件的滚动锚定优化,但如果你的QuickGrid没有正确适配该机制:比如未设置固定的RowHeight(或Virtualize的ItemSize)、动态行高导致锚定失效,滚动时组件无法正确跟踪已渲染项的位置,会出现滚动位置跳变,表现为Skip值突然重置,同时伴随持续抖动。.NET 6没有这个锚定机制,因此不会出现这类问题。
排查建议
- 先验证
ItemsProvider返回的TotalItemCount是否准确且稳定,确保每次请求都返回正确的总条数,避免组件因总量变化重新计算滚动位置。 - 尝试设置固定行高,给QuickGrid指定
RowHeight属性,看是否能缓解抖动,排查动态行高导致的锚定失效问题。 - 优化异步加载的状态控制,在数据加载过程中避免触发不必要的滚动位置计算,比如通过
Loading状态临时禁用滚动监听,确保数据返回后再更新组件状态。 - 对比.NET 6和.NET 8的QuickGrid源码差异,重点查看虚拟化相关的滚动计算逻辑,定位具体的触发点。
内容的提问来源于stack exchange,提问作者Mabanza

