在 WinForms 应用程序中,treeview
的级别由node.level
给出。
WPF 中的相应命令是什么?
答案 0 :(得分:8)
您问题的直接答案是WPF中没有级别属性。
winforms控件和wpf控件之间没有一对一的关系。因为两者的底层架构和用法完全不同。在WPF中,您将一个层次结构数据(LinkedList类型的Datastructure)绑定到TreeView,并将HeirarchicalDataTemplate定义为Treeview.ItemTemplate属性
答案 1 :(得分:7)
鉴于问题: -
所以当我点击一个节点时,我怎么知道它是哪个级别?有解决方法吗?
这是一种可能的解决方法: -
如果您在 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;
}
此方法将向上移动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();
}
}