Многоколоночное древовидное представление в WPF

Кто-нибудь знает, где я могу получить такой элемент управления, как представление дерева с несколькими столбцами в WPF?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
0
29 285
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

Я использовал это решение, оно работает хорошо.

Dylan 21.01.2009 18:40

Этот URL устарел.

O. R. Mapper 16.03.2019 02:48

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

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

SharpTreeView example

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

<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.

Хорошие скриншоты, но как это использовать? Ваш пример кода, кажется, показывает определение tv:SharpTreeView.View, но остальная часть родительского tv:SharpTreeView отсутствует. Как это работает для тех, кто может использовать стандартный TreeView WPF?

ygoe 11.08.2016 22:10

Это не работает. Неизвестный объект local:AutoCompleteTextBox

Stas BZ 10.10.2016 11:43

@StasBZ Код - это просто пример, его нельзя слепо копировать и вставлять. AutoCompleteTextBox - это пользовательский элемент управления, определенный в SharpDevelop.

Paolo Moretti 10.10.2016 13:01
Здесь - хороший пример использования SharpTreeView
Stas BZ 11.10.2016 10:44

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

Контейнер элементов по умолчанию для 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») распространялось на все столбцы.

Другие вопросы по теме