13

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

4

2 回答 2

9

鉴于问题:-

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

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

如果您在Visual Tree中有一个对 Control 的引用,可能来自一个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;
}

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

如果您需要在 XAML 中使用它,例如,a DataTriggerof aHierarchicalDataTemplate那么您可以将它打包到一个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();
    }
  }
于 2009-01-21T11:33:26.270 回答
8

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

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

于 2009-01-13T06:11:35.500 回答