wpf-每列的TreeListView水平滚动条

时间:2018-12-15 23:28:08

标签: c# wpf

我正在尝试自定义在MSDN TreeListView上描述并从GitHub Ariesy TreeListView下载的示例 TreeListView

我想应用一个样式更改-为每个列引入单独的水平滚动条。

结果所需的 TreeListView 控件应为horizontal scrollbars location is marked as red-blue rectangles

我没有运气就尝试了其他方法-从来没有为每一列显示水平滚动条-整个控件只显示了一个全局水平和垂直滚动条。我想需要与 ItemsPresenter 相关的一些自定义,但这只是我的假设。这是我当前的代码,仅显示整个 TreeListView 的全局滚动条:

<Style TargetType="{x:Type l:TreeListView}">
    <Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type l:TreeListView}">
            <Border BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="{TemplateBinding BorderThickness}">
                <DockPanel>
                    <GridViewHeaderRowPresenter Columns="{DynamicResource gvcc}"
                                    DockPanel.Dock="Top" AllowsColumnReorder="False"
                                    HorizontalAlignment="Stretch"/>

                    <ScrollViewer HorizontalScrollBarVisibility="Auto"
                              Name="scrollViewerBody"
                              VerticalScrollBarVisibility="Auto">
                        <ItemsPresenter />
                    </ScrollViewer>
                </DockPanel>
            </Border>
        </ControlTemplate>
    </Setter.Value>
    </Setter>
</Style>

这是控件当前的外观: only global scrollbars available

您知道如何实现所需的行为吗?

1 个答案:

答案 0 :(得分:0)

不会发生。控件在幕后的放置方式,没有“跨越列中每一行的”东西”的概念。每行是一个GridViewRowPresenter,它“伪造” ArrangeOverride中的列。您将无法做任何事情来跨越所有行(这是您需要的),因为它们在视觉树上彼此独立并且彼此之间没有关系。 GridViewRowPresenter只是根据每一列的宽度为每一行布置TextBlocks。

您可以通过以其他方式组合控件来实现所需的功能。不过,这还需要很多工作。有一个视图,该视图将标题控件放在顶部,并跟踪列的大小调整为3 ScrollViewers(假设您有3列)。在第一个ScrollViewer中,您将放置一个TreeView…在其他列中,您必须放置一个垂直的堆栈面板,并在树展开/折叠时管理显示和隐藏子项。

话虽这么说...你为什么还要这么做呢?这不是人们期望的。如果要查看更多列,只需拉伸标题即可。多个水平滚动条看起来非常凌乱并且使用户感到困惑。延伸列是人们的期望。