WPF中的ListView垂直滚动条包括标题

5
我有一个绑定到源的列表视图,它可以正常工作。我设置了ScrollViewer.VerticalScrollBarVisibility="Auto",这样如果没有足够的空间来显示项目,它应该显示滚动条。
到此为止一切都很好,它正在显示垂直滚动条,但是还包括GridViewColumn的标题,看起来很奇怪。
那么如何仅为内容显示垂直滚动条,而不与标题一起显示?
任何想法都会有帮助。

你的意思是你不想让滚动条重叠在标题行上面吗? - snurre
@snurre 是的,垂直滚动条也包括标题行。 - Syed
2个回答

5

试一下这个...

        <ListView.Resources>
            <Style TargetType="{x:Type ScrollBar}"
                   BasedOn="{StaticResource {x:Type ScrollBar}}">
                <Style.Triggers>
                    <Trigger Property="Name" Value="PART_VerticalScrollBar">
                        <Setter Property="Margin" Value="0,18,0,0"/>
                    </Trigger>
                </Style.Triggers>                   
            </Style>
        </ListView.Resources>

编辑:

要理解这个过程,首先您需要参考这篇msdn文章,该文章提供了列表视图的默认模板...http://www.google.co.in/url?q=http://msdn.microsoft.com/en-us/library/ms788747(v%3Dvs.85).aspx&sa=U&ei=r_L6TuXlJ8XyrQep_anODw&ved=0CBQQFjAC&sig2=HNWppacyWyhYxn2NcUSbEw&usg=AFQjCNHzlst2jA_pMTzZsUGNxtbWBqYQLQ

在此模板中,我们定义了名为PART_VerticalScrollBar的垂直滚动条。

现在,如果您想更改其属性,例如边距,您将不得不为滚动条设置默认目标类型样式。在上面的示例中,样式的targetType是Scrollbar类,但它没有资源Key!这意味着该ListView下的所有滚动条都将获取该样式,并将其顶部边距设置为18px。但我们不希望它适用于所有滚动条,因此我添加了一个触发器,仅将此样式定位到名称为“PART_VerticalScrollBar”的滚动条。

请告诉我这是否有所帮助。


谢谢,它正常工作了。我已经改变了边距。但您可以解释一下它是如何工作的吗? - Syed

3

我会通过重写ScrollViewer的样式来实现这个功能。这样做的好处是它可以自动处理标题的调整大小。

XAML:

<Grid>
  <Grid.Resources>
    <local:HeightToMarginConverter x:Key="HeightToMarginConverter"/>
    <Style x:Key="{x:Static GridView.GridViewScrollViewerStyleKey}" TargetType="{x:Type ScrollViewer}">
        <Setter Property="Focusable" Value="false"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ScrollViewer}">
                    <Grid Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
<!-- Here I set Grid.ColumnSpan to 2, so it stretches over the scrollbar -->
                        <DockPanel Margin="{TemplateBinding Padding}" Grid.ColumnSpan="2">
                            <ScrollViewer DockPanel.Dock="Top" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">
                                <GridViewHeaderRowPresenter x:Name="gridViewHeaderRowPresenter" AllowsColumnReorder="{Binding TemplatedParent.View.AllowsColumnReorder, RelativeSource={RelativeSource TemplatedParent}}" ColumnHeaderContainerStyle="{Binding TemplatedParent.View.ColumnHeaderContainerStyle, RelativeSource={RelativeSource TemplatedParent}}" ColumnHeaderToolTip="{Binding TemplatedParent.View.ColumnHeaderToolTip, RelativeSource={RelativeSource TemplatedParent}}" ColumnHeaderStringFormat="{Binding TemplatedParent.View.ColumnHeaderStringFormat, RelativeSource={RelativeSource TemplatedParent}}" ColumnHeaderContextMenu="{Binding TemplatedParent.View.ColumnHeaderContextMenu, RelativeSource={RelativeSource TemplatedParent}}" ColumnHeaderTemplate="{Binding TemplatedParent.View.ColumnHeaderTemplate, RelativeSource={RelativeSource TemplatedParent}}" Columns="{Binding TemplatedParent.View.Columns, RelativeSource={RelativeSource TemplatedParent}}" ColumnHeaderTemplateSelector="{Binding TemplatedParent.View.ColumnHeaderTemplateSelector, RelativeSource={RelativeSource TemplatedParent}}" Margin="2,0,2,0" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </ScrollViewer>
                            <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" KeyboardNavigation.DirectionalNavigation="Local" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </DockPanel>
                        <ScrollBar x:Name="PART_HorizontalScrollBar" Cursor="Arrow" Maximum="{TemplateBinding ScrollableWidth}" Minimum="0.0" Orientation="Horizontal" Grid.Row="1" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportWidth}"/>
<!-- Here I set the vertical scrollbar's top margin by binding it to the GridViewHeaderRowPresenter's ActualHeight property and using a converter -->
                        <ScrollBar x:Name="PART_VerticalScrollBar" Cursor="Arrow" Grid.Column="1" Maximum="{TemplateBinding ScrollableHeight}" Minimum="0.0" Orientation="Vertical" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportHeight}" Margin="{Binding ActualHeight, ElementName=gridViewHeaderRowPresenter, Converter={StaticResource HeightToMarginConverter}}"/>
                        <DockPanel Background="{Binding Background, ElementName=PART_VerticalScrollBar}" Grid.Column="1" LastChildFill="false" Grid.Row="1">
                            <Rectangle DockPanel.Dock="Left" Fill="White" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Width="1"/>
                            <Rectangle DockPanel.Dock="Top" Fill="White" Height="1" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/>
                        </DockPanel>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
  </Grid.Resources>
  <ListView>
    <!-- Normal stuff here -->
  </ListView>
</Grid>

HeightToMarginConverter.cs:

class HeightToMarginConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value == null ? new Thickness() : new Thickness(0, (double)value, 0, 0);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接