FindParentWindow(this).Name返回null

时间:2015-01-10 18:36:32

标签: c# wpf

我有一个usercontrol,它是我的应用程序窗口的页脚。我正在尝试获取当前托管usercontrol的Window的名称,顺便说一下,这是几个元素,所以我不能只调用它的父元素。

我已经阅读过有关VisualTreeHelper的文章,我甚至尝试了几个不同的代码示例,如下所示,但无论我做什么,我都会得到类型' System.NullReferenceException'发生在xxxx.exe但未在用户代码中处理。附加信息:对象引用未设置为对象的实例。

public partial class ucFooter : UserControl
{
    public ucFooter()
    {
        InitializeComponent();
        tbParent.Text = FindParentWindow(this).Name;
    }

    private static Window FindParentWindow(DependencyObject child)
    {
        DependencyObject parent = VisualTreeHelper.GetParent(child);

        //CHeck if this is the end of the tree
        if (parent == null) return null;

        Window parentWindow = parent as Window;
        if (parentWindow != null)
        {
            return parentWindow;
        }
        else
        {
            //use recursion until it reaches a Window
            return FindParentWindow(parent);
        }
    }  
}

单步执行代码,永远不会传递If Parent == null check。所以我有两个问题。需要修改什么来使这个工作,为什么它认为父项是空的呢?

1 个答案:

答案 0 :(得分:3)

在执行控件的构造函数期间,尚未建立可视树。将方法的调用移动到Loaded事件处理程序:

public ucFooter()
{
    InitializeComponent();
    Loaded += OnLoaded;
}

private void OnLoaded(object sender, RoutedEventArgs e)
{
    tbParent.Text = FindParentWindow(this).Name;
}

private static Window FindParentWindow(DependencyObject child)
{
    var parent = VisualTreeHelper.GetParent(child);

    if (parent == null)
    {
        return null;
    }

    return (parent as Window) ?? FindParentWindow(parent);
}