更改datagrid的视口

时间:2011-10-14 04:15:01

标签: wpf datagrid scrollbar viewport

我需要将datagrid的视口更改为最大值,以便所有行都在构造函数中传播。所以我使用了Scrollview,行高设置为auto。

<ScrollViewer>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>

        <DataGrid>

        </DataGrid>
    </Grid>
</ScrollViewer>

这会传播所有控件,但现在当我使用滚动条时,它也会移动标题行。我需要滚动条只影响数据网格。

1 个答案:

答案 0 :(得分:1)

我不明白这句话

  

...需要将datagrid的视口更改为最大值,以便所有行都是   在构造函数中传播。所以我使用Scrollview设置了行高   汽车...

...代码中的Viewport设置在哪里?这个constructor是什么?你的术语令人困惑......

但是我可以假设你想要的是数据网格来完全呈现它的行(在行下面没有额外的空间)并且在网格面板上占据一席之地。但是因为您使用了滚动查看器abone网格,所以它也会滚动数据网格标题。

如果您使用“Snoop”,您会发现wpf datagrid有一个滚动查看器作为其可视子项,并且在其自己的模板中有一个Grid面板,ScrollContentPresenter位于Grid.Row下1}} RowDefinition Height为asterick(*)。

使用下面给出的视觉子提取方法,访问Grid descendent并将其高度更改为auto。

  (GetVisualChild<Grid>(myDataGrid)).RowDefintions[1].Height="Auto"

窥探父母所有子女的方法......

    static T GetVisualChild<T>(Visual parent) where T : Visual
    {
        T child = default(T);
        int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < numVisuals; i++)
        {
              Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
              child = v as T;
              if (child == null) child = GetVisualChild<T>(v);
              if (child != null) break;
        }

        return child;
    }  

XAML方式

覆盖dataGrid控件模板...

   <Style TargetType="{x:Type DataGrid}">
       <Setter Property="Template">
           <Setter.Value>
              <ControlTemplate TargetType="{x:Type DataGrid}">
       <Border Background="{TemplateBinding Background}"
              BorderBrush="{TemplateBinding BorderBrush}"
              BorderThickness="{TemplateBinding BorderThickness}"
              SnapsToDevicePixels="True"
              Padding="{TemplateBinding Padding}">
        <ScrollViewer   Focusable="false"
                        Name="DG_ScrollViewer">
          <ScrollViewer.Template>
            <ControlTemplate TargetType="{x:Type ScrollViewer}">
              <Grid>
                <Grid.RowDefinitions>
                  <RowDefinition Height="Auto"/>
                  <RowDefinition Height="Auto"/> <!--This changed to Auto from '*'-->
                  <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>

                <Grid.ColumnDefinitions>
                  <ColumnDefinition Width="Auto"/>
                  <ColumnDefinition Width="*"/>
                  <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>

                <!--Left Column Header Corner -->
                <Button Command="{x:Static dg:DataGrid.SelectAllCommand}"
                        Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type dg:DataGrid}}, Path=CellsPanelHorizontalOffset}"
                        Template="{StaticResource SelectAllButtonTemplate}"
                        Focusable="false"
                        Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dg:DataGrid}}, Path=HeadersVisibility, Converter={x:Static dg:DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static dg:DataGridHeadersVisibility.All}}" />
                <!--Column Headers-->
                <dgp:DataGridColumnHeadersPresenter Grid.Column="1" 
                                                   Name="PART_ColumnHeadersPresenter"
                                                   Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dg:DataGrid}}, Path=HeadersVisibility, Converter={x:Static dg:DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static dg:DataGridHeadersVisibility.Column}}"/>

                <!--DataGrid content-->
                <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" Grid.Row="1" Grid.ColumnSpan="2" CanContentScroll="{TemplateBinding CanContentScroll}" />

                <ScrollBar Grid.Row="1" Grid.Column="2" Name="PART_VerticalScrollBar"
                                         Orientation="Vertical"
                                         Maximum="{TemplateBinding ScrollableHeight}"
                                         ViewportSize="{TemplateBinding ViewportHeight}"
                                         Value="{Binding Path=VerticalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"
                                         Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"/>

                <Grid Grid.Row="2" Grid.Column="1">
                  <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type dg:DataGrid}}, Path=NonFrozenColumnsViewportHorizontalOffset}"/>
                    <ColumnDefinition Width="*"/>
                  </Grid.ColumnDefinitions>
                  <ScrollBar Grid.Column="1"
                             Name="PART_HorizontalScrollBar"
                             Orientation="Horizontal"
                             Maximum="{TemplateBinding ScrollableWidth}"
                             ViewportSize="{TemplateBinding ViewportWidth}"
                             Value="{Binding Path=HorizontalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"
                             Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/>

                </Grid>
              </Grid>
            </ControlTemplate>
          </ScrollViewer.Template>
          <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
        </ScrollViewer>
      </Border>
             </ControlTemplate>
           </Setter.Value>
       </Setter>
   </Style>