문제
이 회사는 실제 숫자가 아닌 문자 'n'을 사용하여 레벨 수를 정의하는 전통적인 복잡한 조직 구조를 가지고 있습니다.나는 고정 폭 글꼴로 달성하려는 구조를 표현하려고 노력할 것입니다.
Alice
,--------|-------,------,------,
Bob Fred Jack Kim Lucy
| |
Charlie Greg
Darren Henry
Eric
보시다시피 Jack, Kim 및 Lucy는 Alice에게 보고하지만 자체 보고는 없으므로 대칭적이지 않습니다.
사용하여 TreeView
와 ItemsPanel
다음을 포함하는 StackPanel
그리고 Orientation="Horizontal"
~이다 충분히 쉬움, 하지만 이로 인해 매우 큰 결과가 발생할 수 있습니다. TreeView
어떤 사람들이 그들에게 보고하는 다른 20명을 갖게 되면!당신은 할 수 있습니다 또한 사용 Triggers
여부를 엿보기 위해 TreeViewItem
자녀가 있다 Property="TreeViewItem.HasItems"
, 그러나 이는 앞서 언급한 것과 같은 맥락이 아니다. ItemsPanel
. 예:나는 Fred가 보고서를 가지고 있다는 것을 알 수 있지만 그들이 자신의 보고서를 가지고 있는지 여부는 알 수 없습니다.
그럼 조건부 서식을 적용할 수 있나요? TreeViewItems
자신의 자녀가 없으면 수직적이어야합니까?
해결책 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>
다른 팁
Josh Smith는 TreeView에 대한 훌륭한 CodeProject 기사를 가지고 있습니다.읽어 여기