如何获取UIElement的父Popup?

时间:2010-01-05 16:45:32

标签: silverlight popup uielement

我对下面的标记有两个问题:

<Popup>
    <Button x:Name="button"/>
</Popup>
  1. 为什么VisualTreeHelper.GetParent(button)会返回null?
  2. 如何获取Popup的父UIElement

5 个答案:

答案 0 :(得分:5)

您是否只是尝试了一个while循环来为.Parents提供元素,而不是通过VisualTree

    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;
            }
        }
    }

我还没有测试过没有PopUp作为父母的东西,但它对我有用。

答案 1 :(得分:3)

  1. 因为Button仅在显示弹出窗口时添加到可视树中。

  2. 嗯...很棘手......

  3. 修改

    以下假设你的弹出窗口是在UserControl的XAML中定义的,所以虽然它的子节点可能不在可视化树中,但弹出原语控件是。

    重新使用我之前发布的一些代码(我真的必须给我一个博客)。

    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;
            }
        }
    }
    

    这为DependencyObject添加了一个扩展方法,该方法使用VisualTreeHelper来统一搜索可视树中添加的对象。所以在后面的usercontrol代码中你可以这样做: -

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

    这将找到Popup,它是“按钮”的父级。

答案 2 :(得分:2)

Popup控件有时很烦人。我现在不知道为什么VisualTreeHelper.GetParent(button)返回null。但是对于第二个this可能有帮助。

答案 3 :(得分:0)

zihotki的解决方案看起来很有前途(我还没有测试过)。

虽然VisualTreeHelper.GetParent(button)返回null,但您可以使用button.Parent,它应该为您提供弹出对象。

答案 4 :(得分:0)

确保PopUp附加VisualTree。有关详细信息,请参阅“备注”部分 http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.popup(v=vs.95).aspx