2011-12-28 14 views
5

Tengo una vista de lista enlazada a la fuente. Está funcionando bien. Configuré ScrollViewer.VerticalScrollBarVisibility = "Auto", de modo que si no hay espacio para mostrar los elementos, debería mostrarse la barra de desplazamiento.La barra de desplazamiento vertical incluye el encabezado de ListView en WPF

Hasta esto está funcionando bien. Está mostrando la barra de desplazamiento vertical, pero también incluye el encabezado de GridViewColoumn. Se ve extraño.

Entonces, ¿cómo mostrar la barra de desplazamiento vertical solo para los contenidos, no con el encabezado?

Cualquier idea será útil.

+0

¿Quiere decir que no desea que la barra de desplazamiento se superponga a la fila del encabezado? – snurre

+0

@snurre Sí, la barra de desplazamiento vertical incluye la fila de encabezado también – Syed

Respuesta

4

probar este ...

 <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> 

EDIT:

Para comprender cómo funciona esto primero que tendrá que hacer referencia este artículo de MSDN que proporciona la plantilla por defecto de la vista de lista ... 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

En esta plantilla tenemos la barra de desplazamiento verticle definido con el nombre PART_VerticalScrollBar.

Ahora, si desea cambiar sus propiedades como Margen, tendrá que establecer un estilo de tipo de destino predeterminado para la barra de desplazamiento. En nuestro ejemplo anterior, targetType del estilo es Scrollbar clase pero no tiene recurso Key! Esto significa que todas las barras de desplazamiento debajo de esa ListView adquirirán el estilo y establecerán su margen superior en 18px. Pero no queremos que se aplique a todas las barras de desplazamiento, así que agregué un disparador que solo apunta a este estilo a la barra de desplazamiento con el nombre "PART_VerticalScrollBar".

Avísame si esto ayuda.

+0

Gracias, está funcionando bien. He cambiado el margen. ¿Pero podrías explicar cómo funciona? – Syed

+0

Ver mi respuesta editada arriba. –

3

Lo conseguiría anulando el estilo del ScrollViewer. El beneficio de esto es que maneja el redimensionamiento del encabezado automáticamente.

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; 
    } 
} 
Cuestiones relacionadas