silverlight popup uielement

silverlight - ¿Cómo puedo obtener el elemento emergente principal para un UIElement?



popup (5)

Tengo dos preguntas sobre el marcado a continuación:

<Popup> <Button x:Name="button"/> </Popup>

  1. ¿Por qué VisualTreeHelper.GetParent(button) devuelve nulo?
  2. ¿Cómo puedo obtener el elemento Popup principal para UIElement ?

  1. Porque el Button solo se agrega al árbol visual cuando se muestra la ventana emergente.

  2. Hmm ... complicado ...

Editar

A continuación, se supone que su ventana emergente se define en el XAML de UserControl por lo que, aunque su hijo no esté en el árbol visual, sí lo es el control de la ventana emergente.

Reutilizando un código que publiqué antes (realmente debo conseguirme un blog).

public static class VisualTreeEnumeration { public static IEnumerable<DependencyObject> Descendents(this DependencyObject root) { int count = VisualTreeHelper.GetChildrenCount(root); for (int i = 0; i < count; i++) { var child = VisualTreeHelper.GetChild(root, i); yield return child; foreach (var descendent in Descendents(child)) yield return descendent; } } }

Esto agrega un método de extensión al DependencyObject que usa el VisualTreeHelper para unificar la búsqueda de objetos agregados en el árbol visual. Entonces, en el código de control de usuario que se encuentra detrás, puede hacer esto:

var popup this.Descendents() .OfType<Popup>() .Where(p => p.Child == button) .FirstOrDefault();

Esto encontrará el Popup que es el padre del "botón".



En lugar de ir a través del VisualTree , ¿acabas de probar un ciclo while para subir los. Padres de los elementos?

private void TryClosePopupParent(object o) { while (o != null) { Popup p = (o as Popup); if(p == null) { o = (o as FrameworkElement).Parent; } else { p.IsOpen = false; break; } } }

Nunca lo he probado en algo que no tiene un PopUp como padre, pero funcionó para mí.


La solución de zihotki parece prometedora (no la he probado).

Aunque VisualTreeHelper.GetParent(button) devuelve nulo, puede usar button.Parent , que debería darle el objeto emergente.


Popup control Popup es muy molesto a veces. Y no tengo ni idea en este momento por qué VisualTreeHelper.GetParent(button) devuelve null. Pero por el momento esto puede ayudar.