【问题标题】:WPF: Org Chart TreeView Conditional FormattingWPF:组织结构图 TreeView 条件格式
【发布时间】:2008-09-16 06:55:35
【问题描述】:

公司具有传统的复杂组织结构,使用字母“n”而不是实际数字来定义级别的数量。我将尝试用等距字体表达我想要实现的结构:

         Alice
 ,--------|-------,------,------,
Bob      Fred    Jack   Kim    Lucy
 |        |      
Charlie  Greg    
Darren   Henry
Eric

您可以看到它不是对称的,因为 Jack、Kim 和 Lucy 向 Alice 报告,但没有他们自己的报告。

TreeView 与包含StackPanelOrientation="Horizontal"ItemsPanel 一起使用是easy enough,但是一旦有些人有20 个其他人向他们报告,这可能会导致非常大的TreeView!你可以also useTriggers 来查看TreeViewItem 是否有Property="TreeViewItem.HasItems" 的孩子,但这与前面提到的ItemsPanel 的上下文不同。 例如:我可以说 Fred 有报告,但不知道他们是否有自己的报告。

那么,如果TreeViewItems 没有自己的孩子,您可以有条件地将其格式化为 Vertical 吗?

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    Josh Smith 有一篇关于 TreeView 的优秀 CodeProject 文章。阅读here

    【讨论】:

      【解决方案2】:

      我确实最终使用了链接文章中的提示,我已经阅读了该文章,但认为对我没有帮助。

      它的核心发生在这里,在一个转换器中:

      <ValueConversion(GetType(ItemsPresenter), GetType(Orientation))> _
      Public Class ItemsPanelOrientationConverter
      Implements IValueConverter
      
      Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, _
      ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) _
      As Object Implements System.Windows.Data.IValueConverter.Convert
      
          'The 'value' argument should reference an ItemsPresenter.'
          Dim itemsPresenter As ItemsPresenter = TryCast(value, ItemsPresenter)
          If itemsPresenter Is Nothing Then
              Return Binding.DoNothing
          End If
      
          'The ItemsPresenter''s templated parent should be a TreeViewItem.'
          Dim item As TreeViewItem = TryCast(itemsPresenter.TemplatedParent, TreeViewItem)
          If item Is Nothing Then
              Return Binding.DoNothing
          End If
      
          For Each i As Object In item.Items
              Dim element As StaffMember = TryCast(i, StaffMember)
              If element.IsManager Then
                  'If this element has children, then return Horizontal'
                  Return Orientation.Horizontal
              End If
          Next
      
          'Must be a stub ItemPresenter'
          Return Orientation.Vertical
      
      End Function
      

      这反过来又被我为 TreeView 创建的样式所消耗:

          <Setter Property="ItemsPanel">
              <Setter.Value>
                  <ItemsPanelTemplate >
                      <ItemsPanelTemplate.Resources>
                          <local:ItemsPanelOrientationConverter x:Key="conv" />
                      </ItemsPanelTemplate.Resources>
                      <StackPanel IsItemsHost="True" 
                                  Orientation="{Binding   
                                  RelativeSource={x:Static RelativeSource.TemplatedParent}, 
                                  Converter={StaticResource conv}}" />
                  </ItemsPanelTemplate>
              </Setter.Value>
          </Setter>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-15
        • 2015-06-16
        • 2018-12-30
        • 2011-04-16
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        相关资源
        最近更新 更多