C# FlowDocument TextElements只允许一个父级

C# FlowDocument TextElements只允许一个父级,c#,wpf,richtextbox,flowdocument,C#,Wpf,Richtextbox,Flowdocument,我通过检查/使用现有段落a的元素构建了一个新的流程文档段落B。令我惊讶的是,我添加到新段落B的元素被神奇地从段落a中删除。我在下面创建了一个简单的插图。第3行执行后,myRun元素将从MyParagraph中删除 1) 怎么做?使MyParagraph能够从其内联集合中删除myRun的底层机制是什么 2) 为什么??我假设设计者不希望一个元素有两个父元素 3) 如果我的观察是正确的,我想我必须在myParagraphB中添加myRun的副本,以避免破坏myParagraphA。复制myRun及其

我通过检查/使用现有段落a的元素构建了一个新的流程文档段落B。令我惊讶的是,我添加到新段落B的元素被神奇地从段落a中删除。我在下面创建了一个简单的插图。第3行执行后,myRun元素将从MyParagraph中删除

1) 怎么做?使MyParagraph能够从其内联集合中删除myRun的底层机制是什么

2) 为什么??我假设设计者不希望一个元素有两个父元素

3) 如果我的观察是正确的,我想我必须在myParagraphB中添加myRun的副本,以避免破坏myParagraphA。复制myRun及其文本和属性(克隆)的最佳方法是什么?这是一个性能的打击,因为我实际上会做这个操作很多

var myRun = new Run("Hello");
var myParagraphA = new Paragraph(myRun);
var myParagraphB = new Paragraph(myRun);

谢谢,

一个项目一次只能在一个列表中是很常见的。您通常会看到父属性(注意:单数)。XmlElement、TreeViewItem等就是这种情况

因此,通过将运行添加到myParagraphB,您可以覆盖它的父属性,并且该属性的正确编码将其从myParagraphA的内联线列表中删除


解决办法确实是:克隆

多谢各位。既然myRun没有实现iClonable,那么它怎么可能被克隆呢。从您的示例中,它将只是文本属性,但还有一些候选项。。。可能创建一个自定义克隆器,或者尝试避免它。当你使用大量的东西(文本装饰等)时,你可以考虑序列化。