tipos terciario secundario primario medicamentos envases envase empaque embalaje ejemplos caracteristicas c# wpf logical-tree

c# - terciario - tipos de envases



Desconectando un elemento de cualquier contenedor primario/no especificado en WPF (2)

Tengo un control que es hijo de otro control (ya que todos los controles / elementos no root están en WPF). Si quiero mover el control a otro contenedor, primero tengo que desconectarlo de su contenedor actual (de lo contrario se lanzará una excepción).

Si sé lo que es el padre, entonces simplemente puedo eliminarlo de su colección, o Contenido o lo que sea. Pero, ¿qué sucede si no sé cuál es el tipo de contenedor principal? ¿Cómo elimino el control secundario entonces?

En el ejemplo de código siguiente: ¿Cómo podría mover "sp1" a otro contenedor sin saber el tipo del padre (Panel, GroupBox ...)?

// Add the child object "sp1" to a container (of any type). StackPanel sp1 = new StackPanel(); SomeParentControl.Children.Add(sp1); // Somewhere else in the code. I still have a reference to "sp1" but now I don''t know what container it is in. I just want to move the "sp1" object to another parent container. AnotherParentControl.Content = sp1; // Generates exception: "Must disconnect specified child from current parent Visual before attaching to new parent Visual."

Lo ideal sería escribir algo como:

sp1.Parent.RemoveChild(sp1);

Pero no he encontrado nada de eso.


NUEVO:

Propongo usar clases base en lugar de todas las demás enumeradas. Pruebe este código, estas 3 clases son los casos más utilizados para sus necesidades. Según tengo entendido, es casi lo mismo que previos ^)

var parent = VisualTreeHelper.GetParent(child); var parentAsPanel = parent as Panel; if (parentAsPanel != null) { parentAsPanel.Children.Remove(child); } var parentAsContentControl = parent as ContentControl; if (parentAsContentControl != null) { parentAsContentControl.Content = null; } var parentAsDecorator = parent as Decorator; if (parentAsDecorator != null) { parentAsDecorator.Child = null; }

ANTIGUO: Por lo que recuerdo, puede usar el tipo Visual como tipo primario e intentar llamar al método RemoveVisualChild.


Puedes escribir una clase auxiliar con un método de extensión:

public static class RemoveChildHelper { public static void RemoveChild(this DependencyObject parent, UIElement child) { var panel = parent as Panel; if (panel != null) { panel.Children.Remove(child); return; } var decorator = parent as Decorator; if (decorator != null) { if (decorator.Child == child) { decorator.Child = null; } return; } var contentPresenter = parent as ContentPresenter; if (contentPresenter != null) { if (contentPresenter.Content == child) { contentPresenter.Content = null; } return; } var contentControl = parent as ContentControl; if (contentControl != null) { if (contentControl.Content == child) { contentControl.Content = null; } return; } // maybe more } }