UWP迁移项目加载SearchBox时偶发Element is already the child of another element错误
问题排查思路
- 优先检查建议项图标资源复用问题
你当前代码中给所有建议项都复用了同一个RandomAccessStreamReference实例:RandomAccessStreamReference.CreateFromUri(new Uri("http://www.dotnettoscana.org/logo.png")),UWP中部分共享资源如果被多个UI元素同时挂载就会触发「元素已属于其他父元素」的异常。你可以先把图标参数替换为null测试,看异常是否复现,如果不再复现就可以确认是该问题,修复时给每个建议项单独创建流实例,或者提前把图标缓存为本地可复用的独立资源即可。 - 检查异步事件的并发冲突
SuggestionsRequested是异步触发的,如果你快速输入、多次触发查询,可能出现前一次异步请求还没完成,新的请求已经发起,两次请求同时操作同一个SearchBox的建议集合,或者旧的deferral完成时控件状态已经变更。你可以加个请求锁,比如定义一个bool _isUserSearchLoading的标识,进入事件时如果为true直接return,deferral完成后再置为false,避免并发操作。 - 检查SearchBox的父容器切换逻辑
排查你当前页面的代码中是否有动态操作UserSearchBox父元素的逻辑,比如把控件从一个容器移到另一个容器、页面导航返回时没有正确清理控件资源、两个SearchBox共享了某个内部模板资源等。如果有动态修改控件父级的逻辑,要确保移除旧父级的Children集合后再添加到新父级。 - 临时屏蔽另一个SearchBox验证
可以先把页面中的IndividualSearchBox注释掉,单独保留UserSearchBox测试,如果不再报错就说明是两个控件共享样式/资源导致的冲突,你可以给两个控件分别定义独立的Style,避免资源共享冲突。 - 升级UWP目标版本验证
部分旧版本的Windows SDK中SearchBox控件本身存在已知的资源复用Bug,你可以把项目的目标SDK版本升级到最新的正式版,看异常是否被修复。
内容的提问来源于stack exchange,提问作者Libin M
相关产品推荐
相关产品推荐

