WPF中TreeView的级别是什么?

13
在WPF应用程序中,通过使用TreeView控件的ItemContainerGenerator.ContainerFromItem(item)方法获取节点对象,然后使用节点对象的ItemsControl.Items.IndexOf(item)方法获取节点的级别。
2个回答

9

问题描述:

我点击一个节点,如何知道它在哪一层级?有没有解决方法?

以下是可能的解决方案:

如果你拥有Visual Tree中控件的引用,可能是来自Click事件,那么你可以使用该控件调用此函数,以确定它在树形视图中位于哪个层级。这是我过去使用过的方法。

private int FindTreeLevel(DependencyObject control)
{
  var level = -1;
  if (control != null)
  {
    var parent = VisualTreeHelper.GetParent(control);
    while (!(parent is TreeView) && (parent != null))
    {
      if (parent is TreeViewItem)
        level++;
      parent = VisualTreeHelper.GetParent(parent);
    }
  }
  return level;
}

这种方法会沿着可视树向上遍历,计算在找到TreeView控件之前发现了多少个TreeViewItem控件。

如果您需要在XAML中使用它,例如HierarchicalDataTemplateDataTrigger,那么您可以将其封装到一个IValueConverter类中。

<Window.Resources>
  <local:TreeLevelConverter x:Key="treeLevelConverter"/>

  <HierarchicalDataTemplate DataType="{x:Type local:MyType}" >
  ...
     <Grid ... >
         <TextBlock x:Name="MyControl" ... />
     ...
     </Grid>
     <HierarchicalDataTemplate.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource treeLevelConverter}}" Value="0" >
              <Setter TargetName="MyControl" Property="Background" Value="Red"/>
        </DataTrigger>
    </HierarchicalDataTemplate.Triggers>
  </HierarchicalDataTemplate>
</Window.Resources>

然后使用以下转换器。
  public class TreeLevelConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
      var level = -1;
      if (value is DependencyObject )
      {
        var parent = VisualTreeHelper.GetParent(value as DependencyObject );
        while (!(parent is TreeView) && (parent != null))
        {
          if (parent is TreeViewItem) 
            level++;
          parent = VisualTreeHelper.GetParent(parent);
        }
      }
      return level;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
      throw new System.NotImplementedException();
    }
  }

8

直接回答你的问题是,在WPF中没有级别属性。

Winforms控件和WPF控件之间没有一对一的关系。因为两者的底层架构和使用方式完全不同。在WPF中,您将绑定一个分层数据(类似于LinkedList的数据结构)到TreeView,并将HeirarchicalDataTemplate定义为TreeView.ItemTemplate属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接