【问题标题】:the level of a treeview in WPF?WPF 中树视图的级别?
【发布时间】:2010-10-01 01:43:12
【问题描述】:

WinForms 应用程序中,treeview 的级别由node.level 给出
WPF中对应的命令是什么?

【问题讨论】:

    标签: c# wpf winforms treeview


    【解决方案1】:

    鉴于问题:-

    所以当我点击一个节点时,我怎么知道它是哪一层呢?有解决办法吗?

    这是一个可能的解决方法:-

    如果您在 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 中提供此功能,例如,DataTriggerHierarchicalDataTemplate,那么您可以将其打包到 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();
        }
      }
    

    【讨论】:

      【解决方案2】:

      您的问题的直接答案是 WPF 中没有级别属性。

      winforms 控件和 wpf 控件之间没有一对一的关系。因为两者的底层架构和用法完全不同。在 WPF 中,您会将层次结构数据(LinkedList 类型的数据结构)绑定到 TreeView 并将 HeirarchicalDataTemplate 定义到 Treeview.ItemTemplate 属性

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        相关资源
        最近更新 更多