2012-02-14 39 views
3

我通過檢查/使用現有段落A的元素來構建新的FlowDocument段落B.令我驚訝的是,我添加到新的段落B中的元素從段落A中被奇蹟般地刪除。下面我創建了一個簡單的例子。第三行執行後,myRun元素將從myParagraphA中刪除。FlowDocument TextElements只允許單個父項

1)如何?什麼是使myParagraphA從其內聯集合中刪除myRun的基本機制?

2)爲什麼?我認爲設計師不想要一個元素擁有2個父母。 3)如果我的觀察結果正確,我想我必須將myRun的副本添加到myParagraphB以避免破壞myParagraphA。複製myRun及其文本和屬性(克隆)的最佳方法是什麼?這是一個性能問題,因爲我實際上會做這個操作很多。

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

感謝,

回答

1

是很常見的一個項目只能在一個列表中的時間。你通常會看到一個Parent屬性(注意:單數)。這是XmlElement,TreeViewItem等的情況。

因此,通過將Run添加到myParagraphB中,您將覆蓋其Parent屬性,並且該屬性的正確編碼會將其從myParagraphA的內聯列表中移除。

解決方案確實是:克隆。

+0

謝謝。 myRun如何克隆,因爲它沒有實現ICloneable? – aidesigner 2012-02-14 22:07:19

+0

棘手。從您的示例中,它將只是Text屬性,但還有更多的候選人......可能會創建一個自定義克隆器,或嘗試避免它。當你使用很多東西(TextDecorations等)時,你可能會考慮序列化。 – 2012-02-14 22:14:39