2012-02-02 11 views
17

ecco l'errore che ho quando voglio collegare un FrameworkElement a una nuova finestra per pubblicarlo in un file PNG.L'elemento specificato è già il figlio logico di un altro elemento. Disconnettilo per primo

Quindi la mia idea è quella di rimuovere il link genitore-figlio, chiamare il mio metodo, e aggiungere il bambino di nuovo con questo codice:

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

Ma ho ottenuto lo stesso errore esatto ...

Ho guardato un sacco di domande su questo errore, qui su SO, ma nessuno ha risposto al mio problema Cosa mi manca?

EDIT: qui è il codice che ha funzionato per me:

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(); 

risposta

17

Se element è figlio di un pannello (ad esempio Grid), è necessario rimuoverlo dalla raccolta Children del Pannello. Se è impostato come Content di un ContentControl, è necessario impostare tale contenuto su null (o qualsiasi altra cosa che non sia element).

+1

Questo mi ha aiutato! Ho postato il codice nella mia domanda modificata :) –

+0

imposterebbe su null, disconnettere anche gli eventi? – Rauld

+0

No, dovresti anche rimuovere qualsiasi gestore di eventi. – Clemens

5

Guillaume,

Si può cercare di usare anche RemoveVisualChild metodo dopo RemoveLogicalChild:

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

Spero che questo aiuti, Piotr.

+0

Ho provato prima ma questo mi dà questo errore: "Visual specificato non è un figlio di questo Visual." –

+0

Guillaume, il codice che ho postato non getta questa eccezione, quindi forse lo stai usando in un contesto diverso. Per favore pubblica un altro codice e descrivi il tuo problema con maggiori dettagli, quindi è più facile per noi aiutarti. –

+0

Inoltre, che cosa è "questo" nel tuo caso? –

1

Ho avuto un problema simile ma leggermente diverso ma ho ricevuto lo stesso messaggio di errore. Ho fatto una soluzione effettuando una classe ereditata e chiamando RemoveLogicalChild (poiché questo è un metodo protetto).

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

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

Ha funzionato per me. Ho fatto un semplice esempio che puoi vedere qui.

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

1

vecchia questione, ma non ho avuto fortuna con le altre risposte, così ho fatto un metodo di estensione per rimuovere l'elemento dal suo genitore.

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); 
      } 
     } 
    } 
} 
Problemi correlati