Multi-column Tree-View в WPF

Кто-нибудь знает, где я могу получить элемент управления, например Multi-column Tree-View в WPF?

Ответ 1

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

Но это должно дать вам хорошее начало.

Ответ 2

SharpDevelop имеет подкласс ListView, называемый SharpTreeView, который делает то, что вы ищете.

Вы можете увидеть живой пример этого элемента управления в окне "Смотреть" SharpDevelop:

SharpTreeView example

XAML, используемый в окне Watch (как в версии 5.1.0 beta):

<tv:SharpGridView x:Key="variableGridView" AllowsColumnReorder="False">
    <GridView.Columns>
        <GridViewColumn Header="{core:Localize MainWindow.Windows.Debug.LocalVariables.NameColumn}" Width="200">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <tv:SharpTreeNodeView />
                        <local:AutoCompleteTextBox x:Name="name" Margin="-6 0 0 0"  MinWidth="100" Text="{Binding Node.Name}" IsEditable="{Binding Node.CanSetName}">
                            <local:AutoCompleteTextBox.ContextMenu>
                                <MultiBinding Converter="{StaticResource menuBuilder}">
                                    <Binding Path="Node.ContextMenuAddInTreeEntry" />
                                    <Binding Path="Node" />
                                </MultiBinding>
                            </local:AutoCompleteTextBox.ContextMenu>
                        </local:AutoCompleteTextBox>
                    </StackPanel>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="{core:Localize MainWindow.Windows.Debug.LocalVariables.ValueColumn}" Width="200">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <local:AutoCompleteTextBox
                        MinWidth="100"
                        Text="{Binding Node.Value}"
                        IsEditable="{Binding Node.CanSetValue}">
                        <local:AutoCompleteTextBox.ContextMenu>
                            <MultiBinding Converter="{StaticResource menuBuilder}">
                                <Binding Path="Node.ContextMenuAddInTreeEntry" />
                                <Binding Path="Node" />
                            </MultiBinding>
                        </local:AutoCompleteTextBox.ContextMenu>
                    </local:AutoCompleteTextBox>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="{core:Localize MainWindow.Windows.Debug.LocalVariables.TypeColumn}" Width="200">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <local:AutoCompleteTextBox MinWidth="100" Text="{Binding Node.Type}" IsEditable="False">
                        <local:AutoCompleteTextBox.ContextMenu>
                            <MultiBinding Converter="{StaticResource menuBuilder}">
                                <Binding Path="Node.ContextMenuAddInTreeEntry" />
                                <Binding Path="Node" />
                            </MultiBinding>
                        </local:AutoCompleteTextBox.ContextMenu>
                    </local:AutoCompleteTextBox>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
    </GridView.Columns>
</tv:SharpGridView>

Ресурс установлен в свойство View для элемента управления SharpTreeView.

Ответ 4

Если вам не нужны заголовки столбцов, это довольно просто. Вы можете просто предоставить шаблон контейнера элементов, добавить столбцы сетки фиксированной ширины вправо и привязать его к данным, соответствующим вашему товару.

Контейль для элементов по умолчанию для TreeView имеет сетку, определенную как (с некоторыми добавленными комментариями):

    <Grid>
        <Grid.ColumnDefinitions>
            <!--Expander--><ColumnDefinition MinWidth="19" Width="Auto"/>
            <!--Item--><ColumnDefinition Width="Auto"/>
            <!--Overflow--><ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <!--Current Item--><RowDefinition Height="Auto"/>
            <!--Sub-items--><RowDefinition/>
        </Grid.RowDefinitions>
        <ToggleButton x:Name="Expander" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ExpandCollapseToggleStyle}"/>
        <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="1" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
            <ContentPresenter x:Name="PART_Header" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
        </Border>
        <ItemsPresenter x:Name="ItemsHost" Grid.ColumnSpan="2" Grid.Column="1" Grid.Row="1"/>
    </Grid>

Итак, просто растяните эту сетку, чтобы содержать столбцы прогнозируемой ширины справа, и у вас будут столбцы.

  • Добавить определение столбца для нового столбца, сделать его автоматическим размером
  • Обновить диапазон столбцов "ItemsHost", чтобы охватить добавленный столбец
  • Добавьте в этот стол элемент управления предсказуемой шириной:

Потери затронуты:

<Grid>
...
   <ColumnDefinition Width="Auto"/>
...
   <ItemsPresenter ... Grid.ColumnSpan="3" ... />
...
   <Border Grid.Column="3"><!--Add column data here--></Border>
...
</Grid>

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

Наши потребности быстро выросли, и мы добавили сетку с метками столбцов за пределами дерева и привязали ширину столбцов к ширине этих "столбцов" [фактически, ширины связующего элемента управления в рассматриваемых столбцах, используя авто-размер столбцы]. Он работает, и это все, что я скажу в его защите.

Этот подход может быть также выполнен в сгенерированном шаблоне элемента вместо контейнера элемента, если вы не возражаете (или хотите) поле выбора (граница "Bd" ), проходящее по всем столбцам.