我有一个称为ZoneContainer
的USERCONTROL。该属性包含一个包含许多ListItem
s的ListBox
。每个ListItem都包含一个DockPanel
。
我正在尝试使用以下代码来查找ZoneContainer
中存在的孩子,但childrenCount
每次都是0。
var parent = this as DependencyObject; // I can see that this is populated.
int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
是否有另一种方法可以在对象列表中找到特定的子对象?最终,我正在尝试找到Dockpanel,但是即使我知道他们在对象中,也没有找到任何孩子。
这里的基本问题是,并非所有孩子都是VisualTree的一部分
您可以在Josh Smith的此工件中找到有关此问题的更多信息
这是我所有孩子的扩展名
public static IEnumerable<DependencyObject> getChilds(this DependencyObject parent)
{
if (parent == null) yield break;
//use the logical tree for content / framework elements
foreach (object obj in LogicalTreeHelper.GetChildren(parent))
{
var depObj = obj as DependencyObject;
if (depObj != null)
yield return depObj;
}
//use the visual tree for Visual / Visual3D elements
if (parent is Visual || parent is Visual3D)
{
int count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
yield return VisualTreeHelper.GetChild(parent, i);
}
}
}
这是我在库中潜伏的功能。我从来没有遇到过任何麻烦,但是它确实有一个getchildrencount()打电话,因此,如果对您不起作用,您可能会有更大的问题。
Public Shared Function FindVisualChild(Of T As DependencyObject)(ByVal element As DependencyObject) As T
If element Is Nothing Then
Return Nothing
ElseIf TypeOf (element) Is T Then
Return element
Else
Dim count = VisualTreeHelper.GetChildrenCount(element)
For index As Integer = 0 To count - 1
Dim child As DependencyObject = VisualTreeHelper.GetChild(element, index)
If TypeOf (child) Is T Then
Return child
Else
Dim grandchild As T = FindVisualChild(Of T)(child)
If grandchild IsNot Nothing Then Return grandchild
End If
Next
End If
Return Nothing
End Function
用法:x = findvisualChild(of dockpanel)(parentObject)
是的,我知道这是VB。现在是你们中的一个人必须一次转换代码了!:)
我通过查询对象而不是爬行视觉树解决了这个问题。
var header = container.ListBox.Items.Cast<ListBoxItem>()
.Select(item => (MyType) item.Content)
.FirstOrDefault(myType => myType.dpHeader.Name == "whatever").dpHeader;