2012-02-02 15 views
17

aquí está el error que tengo cuando quiero adjuntar un FrameworkElement a una nueva ventana para publicarlo en un archivo PNG.El elemento especificado ya es el elemento lógico de otro elemento. Desconectar primero

Así que mi idea es eliminar el vínculo entre padres e hijos, llamar a mi método, y añadir al niño de nuevo con este código:

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

pero me dio el mismo error exacto ...

Mire muchas preguntas sobre este error, aquí en SO, pero ninguna respondió a mi problema ¿Qué me estoy perdiendo?

EDIT: aquí está el código que trabajó para mí:

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

Respuesta

17

Si element es el elemento secundario de un Panel (por ejemplo, Cuadrícula), debe quitarlo de la colección Children del Panel. Si está configurado como Content de ContentControl, debe establecer ese contenido como nulo (o cualquier otra cosa que no sea element).

+1

¡Eso me ayudó! Publiqué el código en mi pregunta editada :) –

+0

¿Establecería nulo, desconectaría los eventos también? – Rauld

+0

No, también debería eliminar cualquier controlador de eventos. – Clemens

5

Guillaume,

Usted puede tratar de utilizar, además, RemoveVisualChild método después RemoveLogicalChild:

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

Espero que esto ayude, Piotr.

+0

Lo probé antes, pero esto me da este error: "Visualizada no es un elemento secundario de este Visual". –

+0

Guillaume, el código que publiqué no arroja esta excepción, por lo que quizás lo esté usando en un contexto diferente. Publique un código más y describa su problema con más detalle para que podamos ayudarlo más fácilmente. –

+0

Además, ¿qué es "esto" en su caso? –

1

Tuve un problema similar pero ligeramente diferente pero recibí el mismo mensaje de error. Hice una solución al hacer una clase heredada y llamar a RemoveLogicalChild (ya que este es un método protegido).

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

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

Me funcionó. Hice un simple ejemplo que puedes ver aquí.

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

1

pregunta antiguo, pero que no tenía suerte con las otras respuestas, así que hice un método de extensión para quitar el elemento de su matriz.

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); 
      } 
     } 
    } 
} 
Cuestiones relacionadas