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>
- ¿Por qué
VisualTreeHelper.GetParent(button)devuelve nulo? - ¿Cómo puedo obtener el elemento
Popupprincipal paraUIElement?
Porque el
Buttonsolo se agrega al árbol visual cuando se muestra la ventana emergente.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".
Asegúrese de que PopUp esté conectado al VisualTree . Encuentre más información sobre esto en la sección de Comentarios http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.popup(v=vs.95).aspx
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.