您的问题的直接答案是WPF中没有级别属性.
winforms控件和wpf控件之间没有一对一的关系.因为两者的底层架构和用法完全不同.在WPF中,您将一个层次结构数据(LinkedList类型的Datastructure)绑定到TreeView,并将HeirarchicalDataTemplate定义为Treeview.ItemTemplate属性
鉴于这个问题: -
所以当我点击一个节点时,我怎么知道它是哪个级别?有解决方法吗?
这是一个可能的解决方法: -
如果你在一个控件的引用视觉树,可能是从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;
}
Run Code Online (Sandbox Code Playgroud)
此方法将向上走的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>
Run Code Online (Sandbox Code Playgroud)
然后使用以下转换器
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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8049 次 |
| 最近记录: |