我正在尝试自定义在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
您知道如何实现所需的行为吗?
答案 0 :(得分:0)
不会发生。控件在幕后的放置方式,没有“跨越列中每一行的”东西”的概念。每行是一个GridViewRowPresenter,它“伪造” ArrangeOverride中的列。您将无法做任何事情来跨越所有行(这是您需要的),因为它们在视觉树上彼此独立并且彼此之间没有关系。 GridViewRowPresenter只是根据每一列的宽度为每一行布置TextBlocks。
您可以通过以其他方式组合控件来实现所需的功能。不过,这还需要很多工作。有一个视图,该视图将标题控件放在顶部,并跟踪列的大小调整为3 ScrollViewers(假设您有3列)。在第一个ScrollViewer中,您将放置一个TreeView…在其他列中,您必须放置一个垂直的堆栈面板,并在树展开/折叠时管理显示和隐藏子项。
话虽这么说...你为什么还要这么做呢?这不是人们期望的。如果要查看更多列,只需拉伸标题即可。多个水平滚动条看起来非常凌乱并且使用户感到困惑。延伸列是人们的期望。