2011-12-15 5 views
2

C# WPF 응용 프로그램에서 DataGrid에 레이아웃 문제가 있습니다. 많은 행이 있기 때문에 내 DataGrid의 내용을 내 DataGrid에 표시 할 수없는 경우 scrollviewer (및 스크롤 막대)가 표시됩니다. 이것은 올바른 방법이며 나는 그것에 만족합니다.WPF Datagrid에서 스크롤 막대의 위치 변경

문제는, 내 datagrid에서 scrollviewer의 위치 ist 잘못입니다. 스크롤 뷰어는 머리글 행에서 시작하지만 스크롤 막대는 내 콘텐츠의 첫 번째 행에 표시됩니다. 머리글에는 흰 재 패턴이 있습니다. 내 DataGrid의 배경이 흰색이기 때문입니다. 하지만 내 머리글의 배경은 회색입니다.

내 문제를 명확히하기 위해 빨간색 화살표가있는 그림을 업로드했습니다. 흰색 재 지정은 정말보기 흉하게 보입니다. 제 의견으로는 scrollviewer의 위치를 ​​변경하는 것이 더 좋으므로 내용의 첫 번째 행에서 시작됩니다. 어쩌면 문제를 해결할 또 다른 가능성이 있을까요?

"에서 Datagrid와의 ScrollViewer"- 이미지 : 어떤 힌트를

enter image description here

감사, 내가 문제를 해결하는 데 도움이 될 것입니다!

안부, 점멸

답변

3

당신이 당신의 데이터 그리드에 대한 자신 만의 스타일을 만들 수 있습니다, 여기에 두 가지 변화

과 조화로 만든 스타일

이 두 가지 변화 PART_VerticalScrollBar에 대한

에서보기 ->Grid.Row="0"Grid.RowSpan="2" 및 그리드에 대한 그 여기>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> 
을 경우 - PART_HorizontalScrollBar은 보유 691,363,210

는이

0

나는 항상 그 코너를 미워했습니다. 가장 쉬운 방법은 고정 된 크기 인 경우 빈 DataGrid의 배경에 색을 지정하지만 사용자의 머리글 색이 무엇이든간에 DataGrid.Background 색을 설정하는 것입니다. 당신은 항상 스트레칭하지 않는 컨트롤 내부에 DataGrid를 배치하여이를 방지 할 수있는 StackPanel처럼, 어린이, 또는 그것 스크롤바의 덮어 스타일 또는 데이터 그리드의 템플릿 조각을 포함하거나 LastChildFill="False"

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

대안과 DockPanel. 지저분하지만 가능합니다.

0

가에서 ScrollViewer에 데이터 그리드를 동봉이 도움이 될 Auto.Hope 숨겨진 및 VerticalScrollBarVisibility에 그 horizontalScrollBarVisibility을 설정하는 데 도움이되기를 바랍니다.

관련 문제