我正在尝试为WPF使用“FindVisualChild”的基本实现,以便找到Grid
DataTemplate
内存在的特定ListBox
。
实施如下:
private DependencyObject FindVisualChild<T>(DependencyObject obj, string name)
{
Console.WriteLine(((FrameworkElement)obj).Name);
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
FrameworkElement fe = child as FrameworkElement;
//not a framework element or is null
if (fe == null) return null;
if(!string.IsNullOrEmpty(fe.Name))
Console.WriteLine(fe.Name);
if (child is T && fe.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase))
return child;
else
{
//Not found it - search children
DependencyObject nextLevel = FindVisualChild<T>(child, name);
if (nextLevel != null)
return nextLevel;
}
}
return null;
}
我的问题是,这段代码昨天正在查找我在Grid
中定义的DataTemplate
,其名称为“MainTermServListGrid”,如下所示:
<ListBox HorizontalAlignment="Stretch" Grid.Row="1" x:Name="TermServListBox" ItemsSource="{Binding TermServs}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid x:Name="MainTermServListGrid">
//code here
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
但是,今天当我尝试使用相同的方法查找Grid
时,结果始终为null。如果我调试并逐步执行代码,看起来它甚至找不到DataTemplate
中存在的任何项目。
我在使用项目填充FindVisualChild
后立即调用ListBox
方法。可能是因为我没有等待足够长的时间,在我尝试在该列表框中找到特定的孩子之前,窗口没有足够的时间来完成初始化并在列表框中显示新项目吗?
如果是这种情况,是否可以通过简单的await Task.Delay(500)
调用来为UI提供足够的时间来完成加载?或者我在这里做错了什么?
答案 0 :(得分:0)
原来我认为我没有给UI足够的时间来完成加载。我相信这是因为我使用特定方法填充了ListBox
项目,并且在该方法的最后我提出Event
来触发{{1}中的搜索代码隐藏。
因为从完成项目加载到提升事件之间的时间从来没有过一段时间,我不认为ui有时间完成初始化。
基本上我在事件处理程序中解决问题的方法如下:
Window