【问题标题】:Change the position of the scrollbar in a WPF Datagrid更改 WPF Datagrid 中滚动条的位置
【发布时间】:2012-01-21 12:07:00
【问题描述】:

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

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

我上传了一张带有红色箭头的图片来澄清我的问题。白色的矩形看起来真的很丑,所以在我看来这是改变滚动查看器位置的更好方法,所以它从内容的第一行开始。也许还有另一种解决问题的可能?

“带有滚动查看器的数据网格”-图片:

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

最好的问候, 闪光器

【问题讨论】:

    标签: c# wpf scrollbar wpfdatagrid


    【解决方案1】:

    我一直讨厌那个角落。最简单的解决方法是将您的DataGrid.Background 颜色设置为您的标题颜色,尽管这也会为空的DataGrid 的背景着色(如果它具有固定大小)。您始终可以通过将 DataGrid 放在不会拉伸其子控件的控件中来避免这种情况,例如 StackPanel 或带有 LastChildFill="False"DockPanel

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

    替代方法包括覆盖 DataGrid 或其 ScrollBar 的样式或模板片段。混乱,但可能。

    【讨论】:

      【解决方案2】:

      您可以为您的数据网格制作自己的样式,这是一种混合两种更改的样式

      看看这两个变化

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

      希望对你有帮助

      【讨论】:

        【解决方案3】:

        将您的数据网格包含在 Scrollviewer 中并将其 Horizo​​ntalScrollBarVisibility 设置为 hidden 和 VerticalScrollBarVisibility 到 Auto.Hope 这会有所帮助。

        【讨论】:

          猜你喜欢
          • 2011-07-05
          • 2015-11-23
          • 1970-01-01
          • 2011-10-06
          • 1970-01-01
          • 1970-01-01
          • 2011-05-28
          • 1970-01-01
          • 2023-03-08
          相关资源
          最近更新 更多