2011-12-15 2 views
2

У меня проблема с компоновкой с datagrid в моем приложении WPF на C#. Если содержимое моего datagrid не может быть отображено в моем datagrid, потому что есть много строк, отображается scrollviewer (и полоса прокрутки). Это правильный путь, и я рад этому.Измените положение полосы прокрутки в WPF Datagrid

Проблема в том, что положение scrollviewer в моем datagrid неверно. Scrollviewer запускается в строке заголовка, но панель прокрутки отображается в первой строке моего содержимого. В заголовке есть белый ребра. Это потому, что фон моего datagrid белый. Но фон моего заголовка серый.

Я загрузил фотографию с красной стрелкой, чтобы уточнить мою проблему. Белый ретроугольник выглядит очень уродливо, поэтому, на мой взгляд, это лучший способ изменить положение scrollviewer, поэтому он начинается в первой строке содержимого. Может быть, есть еще одна возможность решить проблему?

"Datagrid с ScrollViewer" -Image:

enter image description here

Спасибо за любые подсказки, которые помогут мне решить эту проблему!

С наилучшими пожеланиями, Flasher

ответ

3

вы можете сделать свой собственный стиль для вашего DataGrid, вот стиль, сделанный с сочетанием с двумя изменениями

взгляд на этих двух изменений

для 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 или DockPanel с LastChildFill="False"

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

Альтернативы включают перезапись стили или шаблоны куски DataGrid или это ScrollBars. Беспощадно, но возможно.

0

Заключите ваш DataGrid в ScrollViewer и установите его horizontalScrollBarVisibility в скрытом и VerticalScrollBarVisibility в Auto.Hope это поможет.

Смежные вопросы