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
Popup
principal paraUIElement
?
Porque el
Button
solo 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.