2012-02-02 371 views
17

ここでは、FrameworkElementを新しいウィンドウに添付してPNGファイルにパブリッシュするときのエラーです。指定された要素は既に別の要素の論理的な子です。最初に切断します。

だから、私の考えでは、親子リンクを削除し、私のメソッドを呼び出すと、このコードで再び子を追加することです:

this.RemoveLogicalChild(element); 
PublishFrameworkElement(element, stream); 
this.AddLogicalChild(element); 

しかし、私は正確に同じエラーを得た...

私はこのエラーに関する多くの疑問をここでは見ましたが、私の問題には何も答えませんでした。 私は何が欠けていますか?

編集:ここに私のために働いていたコードは次のとおりです。

var element = _GeneratedContent as FrameworkElement; 
var ParentPanelCollection = (element.Parent as Panel).Children as UIElementCollection; 
ParentPanelCollection.Clear(); 

FileStream stream = [...] 

if (element != null) 
{ 
    PublishFrameworkElement(element, stream); 
    ParentPanelCollection.Add(element); 
} 
stream.Close(); 

答えて

17

elementがパネル(たとえばグリッド)の子である場合は、パネルのChildrenコレクションから削除する必要があります。 ContentControlContentと設定されている場合は、そのコンテンツをnull(またはelement以外)に設定する必要があります。

+1

それは私を助けた!私は私の編集した質問にコードを投稿しました:) –

+0

はnullに設定し、イベントも切断しますか? – Rauld

+0

いいえ、イベントハンドラも削除する必要があります。 – Clemens

5

ギヨーム、

あなたはRemoveLogicalChild指定RemoveVisualChildメソッドを使用し、更にしようとすることができます:

this.RemoveLogicalChild(element); 
this.RemoveVisualChild(element); 
PublishFrameworkElement(element, stream); 

希望により、 Piotr。

+0

私はこれを試しましたが、これは私にこのエラーを与えます。「指定されたビジュアルはこのビジュアルの子ではありません。 –

+0

Guillaume、私が投稿したコードはこの例外をスローしません。多分あなたは別のコンテキストでそれを使用しています。いくつかのコードを掲載して問題をより詳細に記述して、私たちがあなたを助けてくれるようにしてください。 –

+0

また、あなたの場合は「これ」とは何ですか? –

1

私は似ていますがわずかに異なる問題がありましたが、同じエラーメッセージが表示されました。私は継承されたクラスを作成し、RemoveLogicalChild(これは保護されたメソッドであるため)を呼び出すことで回避策を講じました。

public partial class PopupWindow : Window 
{ 
    public PopupWindow() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnClosed(EventArgs e) 
    { 
     base.OnClosed(e); 
     this.RemoveLogicalChild(this.Content); // since protected method 
    } 
} 

私のために働いた。私はあなたがここで見ることができる簡単な例を作った。

http://wpfgrid.blogspot.com/2013/01/wpf-error-specified-element-is-already.html

1

古い質問が、私は他の回答で運を持っていなかったので、私はその親から項目を削除するために拡張メソッドを作りました。

public static class FrameworkElementHelper 
{ 
    public static void RemoveFromParent(this FrameworkElement item) 
    { 
     if (item != null) 
     { 
      var parentItemsControl = (ItemsControl)item.Parent; 
      if (parentItemsControl != null) 
      { 
       parentItemsControl.Items.Remove(item as UIElement); 
      } 
     } 
    } 
} 
関連する問題