2012-02-14 7 views
3

既存の段落Aの要素を調べたり使用して、新しいFlowDocument段落Bを作成しました。私の驚いたことに、新しい段落Bに追加した要素はParagraphAから魔法のように削除されました。私は以下の簡単な図を作成しました。 3行目が実行されると、myRun要素はmyParagraphAから削除されます。FlowDocument TextElementsは単一の親のみを許可しました

1)方法は? myParagraphAがmyRunをそのインラインコレクションから削除できるようにする根底にあるメカニズムは何ですか?

2)なぜですか?私はデザイナーが要素に2つの親を持たせたくないと仮定します。

3)私の所見が正しい場合は、myParagraphAを破壊しないようにmyParagraphBにmyRunのコピーを追加する必要があります。 myRunをテキストとプロパティ(Cloning)でコピーする最良の方法は何ですか?これは実際にこの操作をたくさん行うので、これはパフォーマンスヒットです。

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

おかげで、

答えて

1

これは、アイテムが一度に一つのリストにできることは非常に一般的です。通常、Parentプロパティが表示されます(注:単数)。これは、XmlElement、TreeViewItemなどのケースです。

したがって、RunParagraphBを追加すると、Parentプロパティが上書きされ、そのプロパティの適切なコーディングによってmyParagraphAのインラインリストから削除されます。

解決策は確かです:クローニング。

+0

ありがとうございます。 myRunはICloneableを実装していないので、どのようにクローンを作成できますか? – aidesigner

+0

トリッキー。あなたのサンプルからはTextプロパティだけになりますが、候補がいくつかあります...おそらくカスタムクローナを作成したり、それを避けるようにしてください。たくさんのもの(TextDecorationsなど)を使用するときは、シリアライズを考慮する必要があります。 –

関連する問題