Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 更改datagrid的视口_Wpf_Datagrid_Scrollbar_Viewport - Fatal编程技术网

Wpf 更改datagrid的视口

Wpf 更改datagrid的视口,wpf,datagrid,scrollbar,viewport,Wpf,Datagrid,Scrollbar,Viewport,我需要将datagrid的viewport更改为maximum,以便在构造函数中传播所有行。所以我使用了Scrollview,行高设置为自动 <ScrollViewer> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <G

我需要将datagrid的viewport更改为maximum,以便在构造函数中传播所有行。所以我使用了Scrollview,行高设置为自动

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

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

        <DataGrid>

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


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

我不理解这句话

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

。。。代码中的
视口
设置在哪里?这个
构造函数是什么?你的术语令人困惑

但是,我可以假设您想要的是datagrid完全渲染其行(行下面没有额外的空间),并在网格面板上居中地占据这些行。但由于您使用了一个滚动查看器一个网格,它也会滚动datagrid头

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

使用下面给出的可视化子项提取方法,访问该网格的子项,并将其高度更改为“自动”

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

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

        <DataGrid>

        </DataGrid>
    </Grid>
</ScrollViewer>
  (GetVisualChild<Grid>(myDataGrid)).RowDefintions[1].Height="Auto"
(GetVisualChild(myDataGrid)).rowDefinitions[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;
    }  
static T GetVisualChild(可视父对象),其中T:Visual
{
T child=默认值(T);
int numVisuals=VisualTreeHelper.GetChildrenCount(父级);
对于(int i=0;i
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> 

我不明白这句话

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

。。。代码中的
视口
设置在哪里?这个
构造函数是什么?你的术语令人困惑

但是,我可以假设您想要的是datagrid完全渲染其行(行下面没有额外的空间),并在网格面板上居中地占据这些行。但由于您使用了一个滚动查看器一个网格,它也会滚动datagrid头

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

使用下面给出的可视化子项提取方法,访问该网格的子项,并将其高度更改为“自动”

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

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

        <DataGrid>

        </DataGrid>
    </Grid>
</ScrollViewer>
  (GetVisualChild<Grid>(myDataGrid)).RowDefintions[1].Height="Auto"
(GetVisualChild(myDataGrid)).rowDefinitions[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;
    }  
static T GetVisualChild(可视父对象),其中T:Visual
{
T child=默认值(T);
int numVisuals=VisualTreeHelper.GetChildrenCount(父级);
对于(int i=0;i
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> 


谢谢。你理解我的意图。在XAML中可以这样做吗?如果您坚持使用XAML,那么您将不得不覆盖整个
DataGrid
模板来进行这样的简单更改。你同意吗?如果是这样的话,请看我上面编辑的回复…我实现了第一种方式,还启用了垂直滚动,但当加载数据时,滚动将被禁用,我无法使用。谢谢。你理解我的意图。在XAML中可以这样做吗?如果您坚持使用XAML,那么您将不得不覆盖整个
DataGrid
模板来进行这样的简单更改。你同意吗?如果是这样的话,请看上面我编辑过的回复…我实现了第一种方式,也启用了垂直滚动,但当数据加载时,滚动会被激活