【问题标题】:Multi-column Tree-View in WPF [closed]WPF中的多列树视图[关闭]
【发布时间】:2016-05-06 03:20:50
【问题描述】:

有谁知道我在哪里可以获得像 WPF 中的多列树视图这样的控件?

【问题讨论】:

    标签: wpf treeview wpf-controls


    【解决方案1】:

    SharpDevelop 具有称为 SharpTreeViewListView 子类,它可以满足您的需求。

    您可以在 SharpDevelop 的“Watch”窗口中看到此控件的实时示例:

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

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

    【讨论】:

    • 不错的截图,但是这应该怎么用呢?您的代码示例似乎显示了 tv:SharpTreeView.View 定义,但缺少父 tv:SharpTreeView 的其余部分。对于可以使用 WPF 标准 TreeView 的人来说,它是如何工作的?
    • 它不起作用。未知对象local:AutoCompleteTextBox
    • @StasBZ 代码只是一个例子,不能盲目复制粘贴。 AutoCompleteTextBox 是 SharpDevelop 中定义的用户控件。
    • Here 是使用 SharpTreeView 的一个很好的例子
    【解决方案2】:

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

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

    【讨论】:

    • 我用过这个方案,效果很好。
    • 此 URL 已过时。
    【解决方案3】:

    如果您不需要列标题,这很容易。您只需提供一个项目容器模板,在右侧添加固定宽度的网格列,然后将其绑定到项目的相关数据。

    TreeView 的默认项目容器有一个定义为(添加了一些 cmets)的网格:

        <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”边框)跨越所有列,也可以在生成的项目模板而不是项目容器中完成此方法。

    【讨论】:

      猜你喜欢
      • 2011-07-14
      • 2014-01-12
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多