【发布时间】:2018-03-19 02:56:43
【问题描述】:
我想创建一个具有以下功能的多时间线控件:
- 每个时间线都有一个在左侧保持静态的标题区域
- 可以水平滚动每个时间线的其余部分。
- 如果控件不适合可用的水平空间,则应在时间线部分下方显示滚动条,而不是标题。
- 如果控件不适合可用的垂直空间,则应在右侧显示一个滚动条,用于上下滚动标题和时间线。
我最接近此布局的是以下 xaml:
<Grid>
<HeaderedContentControl>
<HeaderedContentControl.Template>
<ControlTemplate TargetType="HeaderedContentControl">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ContentPresenter ContentSource="Header" ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}" Content="{TemplateBinding HeaderedContentControl.Header}" />
<ScrollViewer Grid.Column="1" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="{TemplateBinding ContentControl.Content}"
/>
</Grid>
</ControlTemplate>
</HeaderedContentControl.Template>
<HeaderedContentControl.Header>
<ItemsControl>
<Button Height="80" Content="Fixed Header 1" />
<Button Height="80" Content="Fixed Header 2" />
</ItemsControl>
</HeaderedContentControl.Header>
<ItemsControl>
<StackPanel Orientation="Horizontal" Height="80">
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
</StackPanel>
<StackPanel Orientation="Horizontal" Height="80">
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
</StackPanel>
</ItemsControl>
</HeaderedContentControl>
</Grid>
这给了我正确的水平滚动,但没有垂直滚动条:
所以要获得垂直滚动,我只需要用 ScrollViewer 包裹外部 HeaderedContentControl 元素,对吗?
<Grid>
<ScrollViewer>
<HeaderedContentControl>
<HeaderedContentControl.Template>
<ControlTemplate TargetType="HeaderedContentControl">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ContentPresenter
ContentSource="Header"
ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}"
Content="{TemplateBinding HeaderedContentControl.Header}" />
<ScrollViewer Grid.Column="1"
ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
VerticalScrollBarVisibility="Hidden"
HorizontalScrollBarVisibility="Auto"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Content="{TemplateBinding ContentControl.Content}" />
</Grid>
</ControlTemplate>
</HeaderedContentControl.Template>
<HeaderedContentControl.Header>
<ItemsControl>
<Button Height="80" Content="Fixed Header 1" />
<Button Height="80" Content="Fixed Header 2" />
</ItemsControl>
</HeaderedContentControl.Header>
<ItemsControl>
<StackPanel Orientation="Horizontal" Height="80">
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
</StackPanel>
<StackPanel Orientation="Horizontal" Height="80">
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
<Button Width="100" Content="thing" />
</StackPanel>
</ItemsControl>
</HeaderedContentControl>
</ScrollViewer>
</Grid>
结果:
嗯,它几乎是正确的,但是当我降低窗口高度时,我的时间线下方的水平滚动条会被剪裁。我希望它像上一张图片一样保持在顶部,这样我就可以随时水平滚动。
有谁知道我如何做到这一点?
【问题讨论】:
-
也许使用顶级滚动查看器进行所有滚动并摆脱内部滚动查看器?或相反亦然。两个滚动条应该属于同一个滚动查看器,否则外部的滚动条可以滚动内部的滚动条。
-
@EdPlunkett 如果我删除了内部滚动查看器,那么标题列也会滚动,这不是我想要的。
标签: wpf