如何在 WPF 中获取 TreeViewItem 的内容
本文关键字:TreeViewItem 获取 WPF | 更新日期: 2023-09-27 18:31:05
例如,我的 TreeViewItem 标头由 TextBlock 和 Image 组成。我怎样才能获得对它们的引用?
我不确定我是否正确,但是如果您想获得元素的视觉子项,请尝试使用VisualTreeHelper.GetChild
和VisualTreeHelper.GetChildrenCount
。
PS:通常获取对树视图项本身的引用会更有问题......
更新(后代的代码示例):
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;
}
如果你有这样的东西(用 Xaml 或代码创建):
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;
您可以使用以下内容:
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;
}
}
我不建议这样做。最好改为创建自定义标头(包含图像和 TextBlock 属性的类)并将其分配给标头或自定义模板。