Frage

Das Unternehmen verfügt über die traditionelle komplexe Organisationsstruktur, definiert die Höhe der Stufen die Buchstaben ‚n‘ und nicht eine tatsächliche Nummer. Ich werde versuchen, und drücke die Struktur Ich versuche, in Mono-Abstand Schriftart zu erreichen:

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

Wie Sie sehen können es nicht symmetrisch ist, wie Jack, Kim und Lucy Bericht zu Alice, haben aber keine Berichte über ihre eigenen.

Mit einem TreeView mit einem ItemsPanel ein StackPanel und Orientation="Horizontal" enthält, ist einfach genug , aber dies kann in einem sehr großen TreeView führen, wenn einige Leute sie berichten 20 andere haben! Sie können auch Triggers verwenden, um in spähen, ob ein TreeViewItem Kinder mit Property="TreeViewItem.HasItems" hat, aber das ist nicht im gleichen Kontext wie die zuvor genannten ItemsPanel. . ZB: Ich kann sagen, dass Fred Berichte, aber nicht, ob sie Berichte über ihre eigenen haben

So können Sie bedingt Format TreeViewItems Vertikale sein, wenn sie keine eigenen Kinder haben?

War es hilfreich?

Lösung 2

habe ich mit Tipps aus dem verlinkten Artikel am Ende, was ich schon durch gelesen habe, aber hätte nicht gedacht, würde mir helfen.

Das Fleisch kommt es hier, in einem Konverter:

<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

Was wiederum in einem Stil verbraucht wird ich für das TreeView erstellt:

    <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>

Andere Tipps

Josh Smith hat einen excecllent Codeproject Artikel über TreeView. Lesen Sie es hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top