Как я могу выровнять маркер по вертикали в XAML TreeView HierarchicalDataTemplate? - PullRequest
3 голосов
/ 02 июня 2010

Когда узел в моем TreeView имеет несколько строк, пуля TreeView центрируется по вертикали.

Как выровнять маркер TreeView?

альтернативный текст 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>

1 Ответ

2 голосов
/ 02 июня 2010

Хороший вопрос ... конечно, это можно сделать, переопределив шаблон, но это неприятно ... (если вы хотите пойти по этому пути, извлеките шаблон с помощью StyleSnooper или ShowMeTheTemplate и измените VerticalAlignment из ToggleButton)

Другим способом является наследование TreeViewItem и переопределение метода OnApply. Так как ToggleButton имеет имя («Расширитель») в шаблоне по умолчанию, вы можете найти его и применить желаемое 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 с, вам также необходимо создать собственный TreeView:

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

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