В приложении WinForms уровень a treeview
задается node.level
Что такое соответствующая команда в WPF?
Уровень дерева в WPF?
Ответ 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();
}
}