Как добавить кнопку узла в пустой элемент узла - PullRequest
1 голос
/ 19 июня 2020

Все элементы в TreeView, содержащие дочерние элементы, имеют изображение / кнопку , которые можно использовать для открытия этого конкретного узла. Элементы, которые не содержат дочерние элементы, у них нет этого изображения / кнопки.

<TreeView ItemsSource="{Binding nodes}" Grid.ColumnSpan="2">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Path=Nodes}">
            <TextBlock Text="{Binding Name}"></TextBlock>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
            

Как я могу добавить кнопку к пустым узлам (тем, которые не содержат дочерние элементы) для поддержки той же функциональности ( чтобы иметь возможность открыть / закрыть этот узел)?

1 Ответ

1 голос
/ 19 июня 2020

Кнопка Expander существует в каждом TreeViewButton. Его видимость зависит от дочерних элементов - Expander скрыт, если дочерних элементов нет. Он настроен в TreeViewItem ControlTemplate ( см. Полный пример ):

<Trigger Property="HasItems" Value="false">
    <Setter Property="Visibility" TargetName="Expander" Value="Hidden"/>
</Trigger>

вы можете отредактировать весь шаблон и удалить этот триггер

... или переопределить его индивидуально для каждый TreeViewItem:

Добавить стиль для TreeViewItems в TreeView, как это, и обрабатывать событие Loaded:

<TreeView ItemsSource="{Binding nodes}" Grid.ColumnSpan="2">

    <TreeView.ItemContainerStyle>
        <Style TargetType="TreeViewItem">
            <EventSetter Event="Loaded" Handler="FrameworkElement_OnLoaded"/>
        </Style>
    </TreeView.ItemContainerStyle>

    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Path=Nodes}">
            <TextBlock Text="{Binding Name}"/>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>

</TreeView>
private void FrameworkElement_OnLoaded(object sender, RoutedEventArgs e)
{
    var tvi = (TreeViewItem)sender;
    var btn = tvi.Template.FindName("Expander", tvi) as UIElement;
    if (btn != null)
        btn.Visibility = Visibility.Visible;
}

когда TreeViewItem загружен, можно найти кнопку Expander в визуальном дереве , созданный из ControlTemplate. Назначение локального значения для Visibility отменяет существующий триггер

expander for empty nodes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...