UWP目标版本10240:资源字典元素已属另一元素异常咨询
解决UWP中资源元素添加时的“Element is already the child of another element.”异常
嘿,我来帮你搞定这个问题!你碰到的情况其实挺常见的——哪怕是页面资源里定义的元素,也会触发这个异常,核心原因是**UWP资源字典里的元素默认是单例(共享实例)**的。也就是说,不管你从资源里取多少次这个Border,拿到的都是同一个对象。当你第一次把它加到UI容器里,它就有了父元素,再尝试添加时(哪怕是再次从资源里取了“看似新的”实例),系统发现它已经有父元素了,就会抛出这个异常。
下面给你两个靠谱的解决方案:
方案一:给资源元素添加x:Shared="False"属性
在XAML里定义Border资源时,加上x:Shared="False",这样每次从资源字典获取这个元素时,都会生成一个全新的实例,就不会有重复父元素的问题了。示例代码:
<Page.Resources> <Border x:Key="MyCustomBorder" x:Shared="False" Background="CornflowerBlue" Width="150" Height="150"/> </Page.Resources>
然后在代码里正常获取并添加即可:
// 每次调用都会拿到新的Border实例 var border = (Border)Resources["MyCustomBorder"]; MyStackPanel.Children.Add(border);
注意:
x:Shared属性在UWP目标版本10240及以上是支持的,刚好符合你的项目要求。
方案二:通过代码动态创建元素实例
如果不想依赖资源字典的共享属性,也可以直接在代码里写一个创建Border的方法,每次需要的时候调用这个方法生成新的实例,完全避免实例共享的问题:
private Border CreateCustomBorder() { return new Border { Background = new SolidColorBrush(Colors.CornflowerBlue), Width = 150, Height = 150, // 还可以在这里添加其他属性,比如CornerRadius、Child元素等 }; } // 使用时 var newBorder = CreateCustomBorder(); MyStackPanel.Children.Add(newBorder);
这种方法更灵活,尤其是需要根据不同场景调整Border属性的时候,比从资源里取再修改要方便。
额外提醒
如果你之前已经把资源里的Border实例加到了UI里,哪怕后来把它从父容器中移除,再重新添加时也要注意:如果是共享实例,移除后它的Parent会变为null,这时候可以再次添加;但如果没移除就重复添加,不管是不是资源里的元素,都会触发异常哦。
内容的提问来源于stack exchange,提问作者Fernando
相关产品推荐
相关产品推荐

