EDITAR:
Solo he pensado en algo. Si puede establecer un controlador cargado en cada elemento que aparece en su árbol visual, quizás podría hacerse con una técnica como esta (considere esta una idea MUY básica, como un comienzo hacia una posible solución):
public class ElementChildrenChangedEventArgs
{
public ElementChildrenChangedEventArgs(FrameworkElement parent, FrameworkElement child)
{
Parent = parent;
Child = child;
}
public FrameworkElement Parent { get; private set;}
public FrameworkElement Child { get; private set;}
}
public delegate void ChildrenChanged(ElementChildrenChangedEventArgs args);
public static class ElementLoadedManager
{
private static readonly HashSet<FrameworkElement> elements = new HashSet<FrameworkElement>();
public static void Process_Loaded(FrameworkElement fe)
{
FrameworkElement feParent = VisualTreeHelper.GetParent(fe) as FrameworkElement;
if (feParent != null)
{
if (elements.Contains(feParent))
{
InvokeChildrenChanged(feParent, fe);
}
}
if (!elements.Contains(fe))
{
elements.Add(fe);
}
fe.Unloaded += Element_Unloaded;
}
static void Element_Unloaded(object sender, RoutedEventArgs e)
{
FrameworkElement fe = sender as FrameworkElement;
elements.Remove(fe);
ClearUnloaded(fe);
}
static void ClearUnloaded(FrameworkElement fe)
{
fe.Unloaded -= Element_Unloaded;
}
public static event ChildrenChanged ChildrenChanged;
private static void InvokeChildrenChanged(FrameworkElement parent, FrameworkElement child)
{
ElementChildrenChangedEventArgs args = new ElementChildrenChangedEventArgs(parent, child);
ChildrenChanged changed = ChildrenChanged;
if (changed != null) changed(args);
}
}
La idea (y el requisito) sería invocar el método Process_Loaded (FrameworkElement) en el controlador Loaded de cada elemento, que es posible hacer con un poco de configuración de estilo/plantilla.
Y como Loaded es un evento enrutado, puede establecer el manejador solo en la ventana principal y buscar e.OriginalSource.
Bueno, el niño recibe el FrameworkElement.Loaded, pero el padre no sabe que el niño realmente se creó y se le agregó. – decasteljau