【发布时间】:2010-10-01 01:43:12
【问题描述】:
在 WinForms 应用程序中,treeview 的级别由node.level 给出
WPF中对应的命令是什么?
【问题讨论】:
在 WinForms 应用程序中,treeview 的级别由node.level 给出
WPF中对应的命令是什么?
【问题讨论】:
鉴于问题:-
所以当我点击一个节点时,我怎么知道它是哪一层呢?有解决办法吗?
这是一个可能的解决方法:-
如果您在 Visual Tree 中有对控件的引用,可能来自 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,并在找到 TreeView 控件时停止之前计算它找到了多少 TreeViewItem 控件。
如果您需要在 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();
}
}
【讨论】:
您的问题的直接答案是 WPF 中没有级别属性。
winforms 控件和 wpf 控件之间没有一对一的关系。因为两者的底层架构和用法完全不同。在 WPF 中,您会将层次结构数据(LinkedList 类型的数据结构)绑定到 TreeView 并将 HeirarchicalDataTemplate 定义到 Treeview.ItemTemplate 属性
【讨论】: