TabViewItem切换标签时内部UserControl重载丢失信息如何解决
问题现象
在TabViewItem内部放置自定义UserControl,代码如下:
<TabViewItem> <local:ListViewUC x:Name="listView" Chapter="{x:Bind Chapter}"/> </TabViewItem>
不同标签页切换时,标签内的内容会自动重新加载,之前留存的操作状态、临时数据全部丢失,复现效果:
解决方法
该行为是TabView默认的内容虚拟化回收机制导致:非当前激活的Tab内容会被框架销毁回收,切回标签时会重新初始化内容实例,触发重载。通过以下配置即可禁用该回收逻辑:
- 开启TabView内置内容缓存
给TabView控件设置IsContentCacheEnabled="True",根据实际标签总数配置CacheLength属性值,切走的标签内容会进入缓存不被销毁,切回时直接复用缓存实例,不会触发重载。
参考配置:<!-- CacheLength可根据自身业务的标签页上限调整 --> <TabView IsContentCacheEnabled="True" CacheLength="15"> <TabViewItem Header="内容页"> <local:ListViewUC x:Name="listView" Chapter="{x:Bind Chapter}"/> </TabViewItem> <!-- 其他TabViewItem --> </TabView> - 特殊场景适配
- 若通过Frame导航在TabViewItem中加载页面,需要给对应页面设置
NavigationCacheMode="Required",避免导航行为触发页面重建。 - 若通过ItemsSource绑定动态生成Tab项,标签切换逻辑中不要重置、重新赋值ItemsSource集合,否则会强制所有Tab项重建,绕过缓存逻辑。
- 检查自定义UserControl的Loaded事件逻辑,不要在Loaded事件中编写强制重置控件状态、重复拉取全量数据的代码,否则即使实例被缓存,切回时触发Loaded事件依然会重置内容。
- 若通过Frame导航在TabViewItem中加载页面,需要给对应页面设置
内容的提问来源于stack exchange,提问作者user16474396
相关产品推荐
相关产品推荐

