уровень дерева в WPF? - PullRequest
       21

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

12 голосов
/ 13 января 2009

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

Ответы [ 2 ]

8 голосов
/ 13 января 2009

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

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

7 голосов
/ 21 января 2009

задан вопрос: -

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

Вот возможный обходной путь: -

Если у вас есть ссылка на элемент управления в Визуальном дереве , возможно, из события 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();
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...