UWP修改内部元素可见性后重新打开AppWindow抛出异常如何解决
异常触发原因
问题核心是UWP可视元素只能归属唯一的视觉树实例,具体触发逻辑如下:
- 首次调用
ElementCompositionPreview.SetAppWindowContent时,你传入的内容(包含m_searchGrid的页面/布局实例)的父级会被绑定到首次创建的AppWindow的视觉宿主上 - 关闭第二个窗口时,系统仅销毁
AppWindow实例,不会主动断开内容元素与原宿主的父子绑定关系 - 你修改了
m_searchGrid的可见性后,元素的视觉布局缓存会被激活,进一步强化了元素与原视觉树的关联 - 第二次创建新
AppWindow时,你复用了同一个内容实例传入SetAppWindowContent,系统检测到该元素已经归属另一个已销毁的视觉树,直接抛出冲突异常
解决方案
任选以下两种方案之一处理即可:
- 方案1:每次打开新窗口时重新实例化内容对象,不要复用全局的页面/布局实例,从根源避免视觉树冲突
- 方案2:如果必须复用内容实例,需要监听
AppWindow的Closed事件,在事件回调中手动解绑内容:_appWindow.Closed += (s, e) => { // 手动断开内容与旧AppWindow的绑定 ElementCompositionPreview.SetAppWindowContent(_appWindow, null); // 可选:将内容的可见性恢复为默认值,清理布局缓存 m_searchGrid.Visibility = Visibility.Visible; };
不需要对元素做额外特殊配置,只需要保证每次调用SetAppWindowContent时,传入的内容实例没有归属任何其他存活/已销毁的视觉树即可。
内容的提问来源于stack exchange,提问作者Cristiano Ghersi
相关产品推荐
相关产品推荐

