2011-12-28 48 views
5

Tôi có một listview được gắn với nguồn. Nó hoạt động tốt. Tôi đã đặt ScrollViewer.VerticalScrollBarVisibility = "Auto", để nếu không có không gian để hiển thị các mục, nó sẽ hiển thị thanh cuộn.Thanh cuộn dọc bao gồm tiêu đề của ListView trong WPF

Làm như vậy nó hoạt động tốt. Nó đang hiển thị thanh cuộn dọc, nhưng nó cũng bao gồm tiêu đề của GridViewColoumn. Nó trông kỳ lạ.

Vậy làm thế nào để chỉ hiển thị thanh cuộn dọc cho nội dung, không phải với tiêu đề?

Bất kỳ ý tưởng nào đều hữu ích.

+0

Bạn có nghĩa là bạn không muốn thanh cuộn chồng lên hàng tiêu đề không? – snurre

+0

@snurre Có, thanh cuộn dọc bao gồm hàng Tiêu đề cũng – Syed

Trả lời

4

Hãy thử này ...

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

Để hiểu cách làm việc này trước hết bạn sẽ phải tham khảo bài viết này MSDN cung cấp cho bạn các mẫu mặc định của giao diện danh sách ... 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

Trong mẫu này, chúng tôi có thanh verticle cuộn được định nghĩa với tên PART_VerticalScrollBar.

Bây giờ nếu bạn muốn thay đổi các thuộc tính của nó như Margin, bạn sẽ phải đặt kiểu kiểu mục tiêu mặc định cho thanh cuộn. Trong ví dụ trên, loại mục tiêu của kiểu là Scrollbar lớp nhưng không có tài nguyên Key! Điều này có nghĩa là tất cả các thanh cuộn trong đó ListView sẽ có được kiểu và đặt lề trên của chúng thành 18px. Nhưng chúng tôi không muốn nó áp dụng cho tất cả các thanh cuộn vì vậy tôi đã thêm một trình kích hoạt chỉ nhắm mục tiêu kiểu này vào thanh cuộn có tên "PART_VerticalScrollBar".

Hãy cho tôi biết nếu điều này có ích.

+0

Cảm ơn, nó hoạt động tốt. Tôi đã thay đổi ký quỹ. Nhưng bạn có thể xin giải thích nó hoạt động như thế nào không? – Syed

+0

Xem câu trả lời của tôi đã chỉnh sửa ở trên. –

3

Tôi sẽ đạt được điều này bằng cách ghi đè kiểu dáng cho ScrollViewer. Lợi ích của việc này là nó xử lý tự động thay đổi kích thước đầu trang.

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; 
    } 
} 
Các vấn đề liên quan