WPF 中树视图的级别?

Posted

技术标签:

【中文标题】WPF 中树视图的级别?【英文标题】:the level of a treeview in WPF? 【发布时间】:2010-10-01 01:43:12 【问题描述】:

WinForms 应用程序中,treeview 的级别由node.level 给出WPF中对应的命令是什么?

【问题讨论】:

【参考方案1】:

鉴于问题:-

所以当我点击一个节点时,我怎么知道它是哪一层呢?有解决办法吗?

这是一个可能的解决方法:-

如果您在 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;

此方法将遍历 VisualTree,并在找到 TreeView 控件时停止之前计算它找到了多少 TreeViewItem 控件。

如果您需要在 XAML 中提供此功能,例如,DataTriggerHierarchicalDataTemplate,那么您可以将其打包到 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();
    
  

【讨论】:

【参考方案2】:

您的问题的直接答案是 WPF 中没有级别属性。

winforms 控件和 wpf 控件之间没有一对一的关系。因为两者的底层架构和用法完全不同。在 WPF 中,您会将层次结构数据(LinkedList 类型的数据结构)绑定到 TreeView 并将 HeirarchicalDataTemplate 定义到 Treeview.ItemTemplate 属性

【讨论】:

以上是关于WPF 中树视图的级别?的主要内容,如果未能解决你的问题,请参考以下文章

如何在双击时禁用WPF TreeView中树项的展开/折叠

如何获取 WPF DataGrid 的单元格级别组合框?

如何检索墙的开口(不是坐标)?

WPF-06 样式(Style)

gtkmm 中树视图选择回调的签名和功能

如何在 swift 3 中为 UITable 视图提供单元格缩进级别?