0

という UserControl がありZoneContainerます。これにはListBox、いくつかの を含む を含むプロパティがありますListItem。各 ListItem にはDockPanel.

ZoneContainer次のコードを使用して、内部に存在するがchildrenCount毎回0である子を見つけようとしています。

var parent = this as DependencyObject; // I can see that this is populated.

int childrenCount = VisualTreeHelper.GetChildrenCount(parent);

オブジェクトのリスト内で特定の子オブジェクトを見つける別の方法はありますか? 最終的には、DockPanel を見つけようとしていますが、オブジェクト内にあることがわかっていても、子が見つかりません。

4

3 に答える 3

1

これは、ライブラリに潜んでいる関数です。問題が発生したことはありませんが、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であることを知っています。C# の連中の 1 人が一度コードを変換しなければならない時が来ました! :)

于 2012-11-06T09:43:15.340 に答える
0

ビジュアル ツリーをクロールするのではなく、オブジェクトをクエリすることで、この問題を解決しました。

var header = container.ListBox.Items.Cast<ListBoxItem>()
    .Select(item => (MyType) item.Content)
    .FirstOrDefault(myType => myType.dpHeader.Name == "whatever").dpHeader;
于 2012-11-26T09:25:33.407 に答える