Изменение окна просмотра данных - PullRequest
1 голос
/ 14 октября 2011

Мне нужно изменить область просмотра таблицы данных на максимум, чтобы все строки распространялись в конструкторе.Поэтому я использовал Scrollview с высотой строки, установленной на auto.

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

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

        <DataGrid>

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

Это распространяется на все элементы управления, но теперь, когда я использую полосу прокрутки, она также перемещает строку заголовка.Мне нужно, чтобы полоса прокрутки влияла только на сетку данных.

1 Ответ

1 голос
/ 14 октября 2011

Я не понимаю это утверждение

... необходимо изменить область просмотра таблицы данных на максимум, чтобы все строки распространялись в конструкторе.Поэтому я использовал Scrollview с высотой строки, установленной на auto ...

... где в коде параметр Viewport?И что это за constructor?Ваша терминология сбивает с толку ....

Однако я могу предположить , что вам нужно, чтобы сетка данных полностью отображала свои строки (без дополнительного пространства под строками) и занимала это по всей панели сетки.,Но поскольку вы использовали автономную сетку средства просмотра с прокруткой, она также будет прокручивать заголовки сетки данных.

Если вы используете «Snoop», вы обнаружите, что wpf datagrid имеет просмотрщик прокрутки в качестве визуального дочернего элемента и имеет панель Grid в своем собственном шаблоне, там ScrollContentPresenter находится под Grid.RowRowDefinition со звездочкой (*) Height.

Используя метод извлечения дочерних элементов, приведенный ниже, получает доступ к потомку Grid и изменяет его высоту на 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> 
...