Подтвердить что ты не робот

Уровень дерева в WPF?

В приложении WinForms уровень a treeview задается node.level
Что такое соответствующая команда в WPF?

4b9b3361

Ответ 1

Прямой ответ на ваш вопрос заключается в том, что в WPF нет свойства уровня.

Между элементами winforms и wpf-контролем нет отношения "один к одному". Поскольку базовая архитектура и использование в обоих случаях совершенно разные. В WPF вы привяжете иерархические данные (LinkedList типа Datastructure) к TreeView и определите HeirarchicalDataTemplate для свойства Treeview.ItemTemplate

Ответ 2

Учитывая вопрос: -

поэтому, когда я нажимаю node, как узнать, какой уровень он есть? есть ли обход?

Здесь возможно обходное решение: -

Если у вас есть ссылка на элемент управления в визуальном дереве, возможно, из события 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 и подсчитывать, сколько элементов TreeViewItem он находит, прежде чем останавливаться, когда находит элемент управления TreeView.

Если вам это нужно в XAML, например, DataTrigger для HierarchicalDataTemplate, вы можете упаковать его в класс 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();
    }
  }