2010-10-02 108 views
2

我不确定这是不是我的机器(WinXP SP3),因为我没有在其他人的屏幕截图中看到它。如何使WPF DataGrid滚动条覆盖不可滚动区域?

它在我看来DataGrid中的滚动条只包含可滚动区域。这意味着,列和行标题区域和右下角以背景颜色显示,这对我来说看起来很丑。我怎样才能让滚动条延伸到控件的边缘(如更多的常规控件)? DataGrid中是否有属性?

如果您没有更改DataGrid的背景颜色,则可能看不到它。我有一个截图here来说明这个问题。

+0

截图链接已损坏。是否有可能重新添加图像嵌入在帖子中? – Athafoud 2016-02-25 08:18:16

+0

[更改WPF Datagrid中滚动条的位置]的可能副本(http://stackoverflow.com/questions/8526120/change-the-position-of-the-scrollbar-in-a-wpf-datagrid) – Athafoud 2016-02-25 08:44:30

回答

2

好的,经过一番努力,我自己想出了。万一有人在乎......把这种风格放到你的App.xaml中。

<ControlTemplate x:Key="SelectAllButtonTemplate" TargetType="{x:Type Button}"> 
    <Grid> 
     <Rectangle x:Name="Border" 
      Fill="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" 
      SnapsToDevicePixels="True" /> 
     <Polygon x:Name="Arrow" 
      HorizontalAlignment="Right" 
      VerticalAlignment="Bottom" 
      Margin="8,8,3,3" 
      Opacity="0.15" 
      Fill="Black" 
      Stretch="Uniform" 
      Points="0,10 10,10 10,0" /> 
    </Grid> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter TargetName="Border" Property="Stroke" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}" /> 
     </Trigger> 
     <Trigger Property="IsPressed" Value="True"> 
      <Setter TargetName="Border" Property="Fill" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}" /> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter TargetName="Arrow" Property="Visibility" Value="Collapsed" /> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

<Style TargetType="{x:Type DataGrid}"> 
    <Setter Property="Background" 
      Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
    <Setter Property="Foreground" 
      Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
    <Setter Property="BorderBrush" Value="#FF688CAF" /> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected" /> 
    <Setter Property="ScrollViewer.CanContentScroll" 
      Value="true"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGrid}"> 
       <Border Background="{TemplateBinding Background}" 
       BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="{TemplateBinding BorderThickness}" 
       SnapsToDevicePixels="True" 
       Padding="{TemplateBinding Padding}"> 
        <ScrollViewer Focusable="false" 
         Name="DG_ScrollViewer"> 
         <ScrollViewer.Template> 
          <ControlTemplate TargetType="{x:Type ScrollViewer}"> 
           <Grid> 
            <Grid.RowDefinitions> 
             <RowDefinition Height="Auto"/> 
             <RowDefinition Height="*"/> 
             <RowDefinition Height="Auto"/> 
            </Grid.RowDefinitions> 

            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="Auto"/> 
             <ColumnDefinition Width="*"/> 
             <ColumnDefinition Width="Auto"/> 
            </Grid.ColumnDefinitions> 

            <!--Left Column Header Corner --> 
            <Button Command="{x:Static DataGrid.SelectAllCommand}" 
         Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=CellsPanelHorizontalOffset}" 
         Template="{StaticResource SelectAllButtonTemplate}" 
         Focusable="false" 
         Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=HeadersVisibility, Converter={x:Static DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static DataGridHeadersVisibility.All}}" /> 
            <!--Column Headers--> 
            <DataGridColumnHeadersPresenter Grid.Column="1" 
                x:Name="PART_ColumnHeadersPresenter" 
                Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=HeadersVisibility, Converter={x:Static DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static DataGridHeadersVisibility.Column}}"/> 

            <!--DataGrid content--> 
            <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" Grid.Row="1" Grid.ColumnSpan="2" CanContentScroll="{TemplateBinding CanContentScroll}" /> 

            <!-- Changed Grid.Row="1" to Grid.Row="0" Grid.RowSpan="2" to make the scrollbar start from top --> 
            <ScrollBar Grid.Row="0" Grid.RowSpan="2" Grid.Column="2" Name="PART_VerticalScrollBar" 
             Orientation="Vertical" 
             Maximum="{TemplateBinding ScrollableHeight}" 
             ViewportSize="{TemplateBinding ViewportHeight}" 
             Value="{Binding Path=VerticalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" 
             Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"/> 

            <!--Grid Grid.Row="2" Grid.Column="1"> 
        <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type dg:DataGrid}}, Path=NonFrozenColumnsViewportHorizontalOffset}"/> 
        <ColumnDefinition Width="*"/> 
        </Grid.ColumnDefinitions> 
        <ScrollBar Grid.Column="1" 
          Name="PART_HorizontalScrollBar" 
          Orientation="Horizontal" 
          Maximum="{TemplateBinding ScrollableWidth}" 
          ViewportSize="{TemplateBinding ViewportWidth}" 
          Value="{Binding Path=HorizontalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" 
          Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/> 

       </Grid--> 
            <!-- Make the scrollbar to start from left edge --> 
            <ScrollBar Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" 
              Name="PART_HorizontalScrollBar" 
              Orientation="Horizontal" 
              Maximum="{TemplateBinding ScrollableWidth}" 
              ViewportSize="{TemplateBinding ViewportWidth}" 
              Value="{Binding Path=HorizontalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" 
              Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/> 
           </Grid> 
          </ControlTemplate> 
         </ScrollViewer.Template> 
         <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
        </ScrollViewer> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsGrouping" Value="true"> 
      <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
     </Trigger> 
    </Style.Triggers> 
</Style>