2012-04-12 8 views

Antwort

1

Ich bin mir nicht sicher, ob ich dich richtig verstanden habe, aber wenn du visuelle Kinder eines Elements bekommen willst, versuche es mit VisualTreeHelper.GetChild und VisualTreeHelper.GetChildrenCount.

PS: In der Regel ist es problematischer einen Verweis auf die TreeViewItem selbst zu bekommen ...

UPDATE (A-Code-Beispiel für zukünftige Generationen):

private IEnumerable<DependencyObject> GetChildren(DependencyObject parent) 
{ 
    var count = VisualTreeHelper.GetChildrenCount(parent); 
    if (count > 0) 
    { 
     for (int i = 0; i < count; i++) 
      yield return VisualTreeHelper.GetChild(parent, i); 
    } 
    else 
     yield break; 
} 

private DependencyObject FindInTheVT(DependencyObject parent,Predicate<DependencyObject> predicate) 
{ 
    IEnumerable<DependencyObject> layer = GetChildren(parent); 

    while (layer.Any()) 
    { 
     foreach (var d in layer) 
      if (predicate(d)) return d; 

     layer = layer.SelectMany(x => GetChildren(x)); 
    } 

    return null; 
} 
+0

Ues, VisualTreeHelper ist was ich brauche. Vielen Dank! – hrum

0

Wenn Sie so etwas wie dieses haben (erstellt in XAML oder Code):

TreeViewItem Item = new TreeViewItem(); 

StackPanel HeaderLayout = new StackPanel() { Orientation = Orientation.Horizontal }; 

HeaderLayout.Children.Add(new Image()); 
HeaderLayout.Children.Add(new TextBlock() { Text = "tv item" }); 

Item.Header = HeaderLayout; 

Sie so etwas wie verwenden:

foreach (object Control in ((StackPanel)Item.Header).Children) 
{ 
    if (Control is Image) 
    { 
     //get the image control: Image img = (Image)Control; 
    } 
    else if (Control is TextBlock) 
    { 
     //get the textblock: TextBlock tb = (TextBlock)Control; 
    } 
} 

Ich empfehle das nicht. Es ist besser, wenn Sie stattdessen einen benutzerdefinierten Header erstellen (eine Klasse, die Image- und TextBlock-Eigenschaften enthält) und diese Ihrer Kopfzeile oder einer benutzerdefinierten Vorlage zuweisen.