WPF中的多列树视图

时间:2009-01-21 02:20:56

标签: wpf treeview wpf-controls

任何人都知道我可以在哪里获得像WPF中的多列树视图一样的控件?

4 个答案:

答案 0 :(得分:10)

SharpDevelop有一个名为SharpTreeViewListView子类,可以满足您的需求。

您可以在SharpDevelop的“观察”窗口中看到此控件的实例:

SharpTreeView example

Watch窗口中使用的XAML(如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>

资源设置为SharpTreeView控件的View属性。

答案 1 :(得分:8)

我是根据旧帖子here实现的。但如果我没记错的话,我必须做一些手工工作才能让事情正常进行。特别是滚动条。

但这应该会给你一个良好的开端。

答案 2 :(得分:4)

有一篇关于codeproject的文章可能有所帮助:

http://www.codeproject.com/KB/WPF/TreeListView.aspx

关于Wpf TreeView还有很多其他有用的articles

答案 3 :(得分: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”边框),也可以在生成的项目模板而不是项目容器中完成此方法。