我有一个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。所以我有两个问题。需要修改什么来使这个工作,为什么它认为父项是空的呢?
答案 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);
}