Zum Beispiel besteht mein TreeViewItem 'Header aus TextBlock und Image. Wie kann ich auf sie verweisen?Wie kann ich Inhalt von TreeViewItem in WPF bekommen?
1
A
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
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.
Ues, VisualTreeHelper ist was ich brauche. Vielen Dank! – hrum