C# WPF TreeViewItem Как убрать отступ?

129
18 мая 2019, 20:50

Как убрать отступ у дочерних елементов TreeViewItem?

Answer 1

Щелкните по TreeView в дизайнере правой кнопкой и выберите Edit Additional Templates>Edit Generated Item Container (ItemContainerStyle)>Edit a Copy... введите имя стиля и нажмите OK

Ищем в полученных ресурсах стиль для TreeViewItem (<Style x:Key="TreeViewItemStyle1" TargetType="{x:Type TreeViewItem}">) и в нем шаблон (<Setter Property="Template">), видим, что в шаблоне Grid с несколькими колонками и ItemsPresenter (который предназначен для вывода дочерних элементов) лежит во второй-третьей колонках:

<ItemsPresenter x:Name="ItemsHost" Grid.ColumnSpan="2" Grid.Column="1" Grid.Row="1"/>

меняем:

<ItemsPresenter x:Name="ItemsHost" Grid.ColumnSpan="3" Grid.Column="0" Grid.Row="1"/>

получаем:

Answer 2

По сути здесь просто нужен вложенный ItemsControl или что то на его основе.

К примеру используем такой вид:

<ItemsControl ItemsSource="{Binding TestItems}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Expander Header="{Binding Name}">
                <ItemsControl ItemsSource="{Binding Items}" BorderThickness="0">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding}" />
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </Expander>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

TestItems - это простая коллекция ObservableCollection<Test>.
Test - класс, который содержит свойство с именем и некий внутренний массив:

class Test
{
    public string Name { get; set; }
    public string[] Items { get; set; }
}

Результат получим такой:

Конечно вы можете тут настроит все как вам нужно. К примеру если хотите выделение, то можно ItemsControl переделать на ListBox со своим стилем или чем то еще.

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

class Test
{
    public string Group { get; set; }
    public string Name { get; set; }
}

Тогда View с группировкой будет следующий:

<Grid>
    <Grid.Resources>
        <CollectionViewSource x:Key="TestGroups" Source="{Binding TestItems}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="Group" />
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>
    </Grid.Resources>
    <ItemsControl ItemsSource="{Binding Source={StaticResource TestGroups}}">
        <ItemsControl.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <Expander Header="{Binding Name}">
                                        <ItemsPresenter />
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </ItemsControl.GroupStyle>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

Результат получим такой:

В общем все зависит от конечного результата, я показал только как можно поступить. Удачи!

Answer 3

Заслуга идеи @EvgeniyZ: нужно выбирать более подходящий контрол

<ListBox ItemsSouce="{Binding }">
    <ListBox.ItemsTemplate>
        <DataTempalte>
            <Expander/>
        </DataTemplate>
    </ListBox.ItemsTemplate>
</ListBox>
READ ALSO
С# адрес объекта в стеке

С# адрес объекта в стеке

Один мой друг спрашивает, возможна ли такая ситуация в C# когда в куче будет храниться адрес объекта (ссылка на объект) в стеке? С учетом того...

141
C# Защита памяти в Assembly.Load()

C# Защита памяти в Assembly.Load()

Я пытаюсь сделать протектор для программ на C#Суть его в том, что защищаемый файл переводится в байты и шифруется

137
Исключение MissingRuntimeArtifactException при использовании .NET Native

Исключение MissingRuntimeArtifactException при использовании .NET Native

У меня при компиляции сборки в Release появляется вот такая ошибка:

185
Unity. Перестал работать Time.timeScale

Unity. Перестал работать Time.timeScale

Делаю игру на мобильные устройства на движке UnityВ игре есть такой момент, когда при столкновении игрока с препятствием я ставлю Time

129