2011-12-15 98 views
2

我的C#WPF应用程序中的数据网格存在布局问题。如果我的数据网格的内容无法显示在我的数据网格中,因为有很多行,则会显示一个滚动查看器(和滚动条)。这是正确的方式,我很高兴。更改WPF Datagrid中滚动条的位置

问题是,我的数据网格scrollviewer的位置是错误的。滚动查看器从标题行开始,但滚动条显示在我的内容的第一行。在标题中有一个白色的纠结。这是因为我的数据网格的背景是白色的。但是我的标题背景是灰色的。

我上传了一张带有红色箭头的图片,以说明我的问题。白色的retangle看起来真的很丑,所以我认为这是更好的方式来改变scrollviewer的位置,所以它开始在内容的第一行。也许有另一种可能性来解决这个问题?

“在DataGrid中的ScrollViewer” - 图像:

enter image description here

感谢您的任何提示,这将帮助我解决这个问题!

最好的问候, 闪光

回答

3

你可以让你自己的风格为您的数据网格,这里是共混物制成有两个变化

风格

看看这两个变化

PART_VerticalScrollBar - >Grid.Row="0"Grid.RowSpan="2" 并为网格持有PART_HorizontalScrollBar - >Grid.ColumnSpan="2"

下面是完整的风格

<Style x:Key="myGridStyle" 
     TargetType="{x:Type Controls: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 Controls:DataGrid}"> 
     <Border SnapsToDevicePixels="True" 
       Background="{TemplateBinding Background}" 
       BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="{TemplateBinding BorderThickness}" 
       Padding="{TemplateBinding Padding}"> 
      <ScrollViewer x:Name="DG_ScrollViewer" 
         Focusable="False"> 
      <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> 
        <Button Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type Controls:DataGrid}}}" 
          Focusable="False"> 
        <Button.Visibility> 
         <Binding Path="HeadersVisibility" 
           RelativeSource="{RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type Controls:DataGrid}}"> 
         <Binding.ConverterParameter> 
          <Controls:DataGridHeadersVisibility>All</Controls:DataGridHeadersVisibility> 
         </Binding.ConverterParameter> 
         </Binding> 
        </Button.Visibility> 
        <Button.Template> 
         <ControlTemplate TargetType="{x:Type Button}"> 
         <Grid> 
          <Rectangle x:Name="Border" 
             Fill="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" 
             SnapsToDevicePixels="True" /> 
          <Polygon x:Name="Arrow" 
            Fill="Black" 
            Stretch="Uniform" 
            HorizontalAlignment="Right" 
            Margin="8,8,3,3" 
            VerticalAlignment="Bottom" 
            Opacity="0.15" 
            Points="0,10 10,10 10,0" /> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsMouseOver" 
            Value="True"> 
          <Setter Property="Stroke" 
            TargetName="Border" 
            Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}" /> 
          </Trigger> 
          <Trigger Property="IsPressed" 
            Value="True"> 
          <Setter Property="Fill" 
            TargetName="Border" 
            Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}" /> 
          </Trigger> 
          <Trigger Property="IsEnabled" 
            Value="False"> 
          <Setter Property="Visibility" 
            TargetName="Arrow" 
            Value="Collapsed" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
         </ControlTemplate> 
        </Button.Template> 
        <Button.Command> 
         <RoutedCommand /> 
        </Button.Command> 
        </Button> 
        <Custom:DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter" 
                  Grid.Column="1"> 
        <Custom:DataGridColumnHeadersPresenter.Visibility> 
         <Binding Path="HeadersVisibility" 
           RelativeSource="{RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type Controls:DataGrid}}"> 
         <Binding.ConverterParameter> 
          <Controls:DataGridHeadersVisibility>Column</Controls:DataGridHeadersVisibility> 
         </Binding.ConverterParameter> 
         </Binding> 
        </Custom:DataGridColumnHeadersPresenter.Visibility> 
        </Custom:DataGridColumnHeadersPresenter> 
        <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" 
              Grid.ColumnSpan="2" 
              Grid.Row="1" 
              Content="{TemplateBinding Content}" 
              ContentStringFormat="{TemplateBinding ContentStringFormat}" 
              ContentTemplate="{TemplateBinding ContentTemplate}" 
              CanContentScroll="{TemplateBinding CanContentScroll}" 
              CanHorizontallyScroll="False" 
              CanVerticallyScroll="False" /> 
        <ScrollBar x:Name="PART_VerticalScrollBar" 
           Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" 
           Grid.Column="2" 
           Grid.Row="0" 
           Grid.RowSpan="2" 
           Maximum="{TemplateBinding ScrollableHeight}" 
           Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" 
           Orientation="Vertical" 
           ViewportSize="{TemplateBinding ViewportHeight}" /> 
        <Grid Grid.Column="1" 
         Grid.ColumnSpan="2" 
         Grid.Row="2"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type Controls:DataGrid}}}" /> 
         <ColumnDefinition Width="*" /> 
        </Grid.ColumnDefinitions> 
        <ScrollBar x:Name="PART_HorizontalScrollBar" 
           Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" 
           Grid.Column="1" 
           Maximum="{TemplateBinding ScrollableWidth}" 
           Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" 
           Orientation="Horizontal" 
           ViewportSize="{TemplateBinding ViewportWidth}" /> 
        </Grid> 
       </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> 

希望这有助于

0

我一直讨厌那个角落。最简单的方法是将您的DataGrid.Background颜色设置为任何标题颜色,但如果它具有固定尺寸,这也会将空白的背景着色为DataGrid。您可以随时避免放置您DataGrid不舒展它控制里面的孩子,就像一个StackPanel,或LastChildFill="False"

<DockPanel LastChildFill="False"> 
    <DataGrid ItemsSource="{Binding MyCollection}" Background="Silver" /> 
</DockPanel> 

替代品包括覆盖样式或DataGrid的模板件或者它的滚动条一个DockPanel。凌乱,但可能。

0

附上您的数据网格中的ScrollViewer及其horizo​​ntalScrollBarVisibility设置为隐藏 和VerticalScrollBarVisibility到Auto.Hope这将帮助。