2011-12-15 291 views
2

C#WPFアプリケーションのデータグリッドにレイアウトの問題があります。多くの行があるため、自分のデータグリッドの内容を自分のデータグリッドに表示できない場合は、スクロールバー(およびスクロールバー)が表示されます。これは正しい方法であり、私はそれについて幸せです。WPF Datagridのスクロールバーの位置を変更します。

問題は、データグリッド内のスクロールビューアの位置が間違っていることです。スクロールビューアはヘッダー行で開始されますが、スクロールバーはコンテンツの最初の行に表示されます。ヘッダーには白いリタングルがあります。これは、私のDataGridの背景が白だからです。しかし、私のヘッダーの背景は灰色です。

私は問題を明確にするために、赤い矢印の画像をアップロードしました。白いリタングルは実際には醜いので、私の意見では、スクロールビューアの位置を変更する方が良い方法なので、コンテンツの最初の行から開始します。多分、問題を解決する別の可能性がありますか?

"データグリッドとScrollViewerの" - 画像:任意のヒントについて

enter image description here

おかげで、私は問題を解決するのに役立ちます!

敬具、 フラッシャー

答えて

3

あなたのデータグリッドのための独自のスタイルを作ることができ、ここでPART_VerticalScrollBarのためにこれら二つの変更

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が成り立ちます

が、これは

0

は、私はいつもその角を嫌ってきました。その周囲の最も簡単な方法は、DataGrid.Backgroundの色をヘッダーの色に合わせることですが、固定サイズの場合は空の背景にも色を付けます(DataGrid)。あなたはいつもStackPanelのように、それは子供のストレッチしないコントロールの内側にあなたのDataGridを置くことであることを避けることができ、またはDockPanel

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

LastChildFill="False"との代替が上書きスタイルを含めるか、データグリッドまたはそれのスクロールバーの部分をテンプレート。メッシー、しかし可能です。 > Grid.Row="0"Grid.RowSpan="2" とそのグリッドの -

0

がScrollViewerの中で、あなたのデータグリッドを囲み、これが役立つAuto.Hopeために隠された とVerticalScrollBarVisibilityにそのhorizo​​ntalScrollBarVisibilityを設定するのに役立ちます願っています。

関連する問題