How can I vertically align the marker in the XAML TreeView HierarchicalDataTemplate?

When a node in my TreeView has multiple rows, the TreeView bullet is centered vertically.

How can I align the treeview marker?

alt text http://www.deviantsart.com/upload/1uh2k8p.png

<pages:BasePage.Resources>
    <data:HierarchicalDataTemplate x:Key="OutlineTemplate"
        ItemsSource="{Binding OutlineDocumentObjects}">
        <TextBlock Text="{Binding Line}" 
            TextWrapping="Wrap" 
            VerticalAlignment="Top"
            Width="600"/>
    </data:HierarchicalDataTemplate>
</pages:BasePage.Resources>

<StackPanel Style="{StaticResource StackPanelPageWrapperStyle}">
    <tk:TreeView x:Name="TheTreeView" 
        ItemsSource="{Binding TheOutline.OutlineDocumentObjects}"
        ItemTemplate="{StaticResource OutlineTemplate}">
    </tk:TreeView>
</StackPanel>
+3
source share
1 answer

Good question ... of course, this can be done by overriding the template, but it's pain ... (if you want to go this way, extract the template using StyleSnooper or ShowMeTheTemplate and change VerticalAlignmentto ToggleButton)

- TreeViewItem OnApply. ToggleButton ( "Expander" ) , VerticalAlignment, :

public class TopAlignedTreeViewItem : TreeViewItem
{
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        if (Template != null)
        {
            ToggleButton btn = Template.FindName("Expander", this) as ToggleButton;
            if (btn != null)
            {
                btn.VerticalAlignment = VerticalAlignment.Top;
            }
        }
    }
}

TreeView TopAlignedTreeViewItem TreeViewItem s, TreeView:

public class TopAlignedTreeView : TreeView
{
    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return (item is TopAlignedTreeViewItem);
    }

    protected override System.Windows.DependencyObject GetContainerForItemOverride()
    {
        return new TopAlignedTreeViewItem();
    }
}
+2

Source: https://habr.com/ru/post/1748148/


All Articles