WPF DataGrid 行在展开行详细信息后不调整高度

标签 wpf datagrid height

我有一个包含分层数据的 DataGrid。每当我折叠行详细信息时,父行不会自动调整大小。这最终意味着,当我不断扩展“行详细信息”时,父网格将继续占用越来越多的空间,直到我折叠同一级别的行。我窥探了应用程序,发现保持新高度的最低级别元素是 DataGridRowsPresenter,即 PART_ColumnHeadersPresenter。

我有自己的行和网格 ControlTemplate:

<Style x:Key="{x:Type Custom:DataGrid}" TargetType="{x:Type Custom:DataGrid}">
        <Setter Property="CanUserResizeRows" Value="False" />
        <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" />
        <!-- This is needed to force DG to have a non-default value.  Otherwise the DGR.DetailsVisibility cannot have a value of VisibleWhenSelected by default. -->
        <Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected" />
        <Setter Property="ScrollViewer.CanContentScroll"
            Value="true"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Custom: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="*"/>
                                            <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 Custom:DataGrid.SelectAllCommand}"
                                            Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type Custom:DataGrid}}, Path=CellsPanelHorizontalOffset}"
                                            Template="{StaticResource SelectAllButtonTemplate}"
                                            Focusable="false"
                                            Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type Custom:DataGrid}}, Path=HeadersVisibility, Converter={x:Static Custom:DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static Custom:DataGridHeadersVisibility.All}}" />

                                        <!--Column Headers-->
                                        <Custom:DataGridColumnHeadersPresenter Grid.Column="1" 
                                                   Name="PART_ColumnHeadersPresenter"
                                                   Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type Custom:DataGrid}}, Path=HeadersVisibility, Converter={x:Static Custom:DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static Custom:DataGridHeadersVisibility.Column}}"/>

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


                                        </ScrollContentPresenter>

                                        <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 Custom: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.Triggers>
            <Trigger Property="IsGrouping" Value="true">
                <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
            </Trigger>
        </Style.Triggers>
    </Style>

<ControlTemplate x:Key="PlainDataGridRowControlTemplate" TargetType="{x:Type Custom:DataGridRow}">
        <Grid x:Name="LayoutRoot">
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Grid x:Name="DGR_Border" 
                Background="Transparent"
                SnapsToDevicePixels="True">
                <Custom:SelectiveScrollingGrid Name="DGR_SelectiveScrollingGrid">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>

                    <Custom:DataGridCellsPresenter Grid.Column="1" Name="DGR_CellsPresenter" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    <Custom:DataGridDetailsPresenter Height="Auto" 
                                                          Grid.Column="1" 
                                                          Grid.Row="1" 
                                                          Visibility="{TemplateBinding DetailsVisibility}" Custom:SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding RelativeSource={RelativeSource AncestorType={x:Type Custom:DataGrid}}, Path=AreRowDetailsFrozen, Converter={x:Static Custom:DataGrid.RowDetailsScrollingConverter}, ConverterParameter={x:Static Custom:SelectiveScrollingOrientation.Vertical}}" />
                    <!--<localprimitives:DataGridRowHeader localprimitives:SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:DataGrid}}, Path=HeadersVisibility, Converter={x:Static local:DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static local:DataGridHeadersVisibility.Row}}"/>-->
                    <Custom:DataGridRowHeader Grid.RowSpan="2" Custom:SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" />
                </Custom:SelectiveScrollingGrid>
            </Grid>
        </Grid>
    </ControlTemplate>
    <Style TargetType="Custom:DataGridRow">
        <Setter Property="Margin" Value="0, 0, 0, 0"/>
        <Setter Property="Template" Value="{StaticResource PlainDataGridRowControlTemplate}" />
    </Style>

有人可以建议一下吗?

最佳答案

我通过在 DataGrid 样式中使用此 setter 解决了这个问题:

<Setter Property="ScrollViewer.CanContentScroll" Value="False" />

但不要问我为什么这与此 setter 一起工作。

关于WPF DataGrid 行在展开行详细信息后不调整高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7393634/

相关文章:

wpf - 使用值转换器时如何更新 View 模型的属性?

c# - 在没有 .Net 的情况下运行 C# 程序 - 不会重新发布

wpf - 在 WPF 中使用图片或图标代替 DataGridCheckBoxColumn

c# - WPF StringFormat 格式化字符串值

jquery - 在容器中从上到下而不是从左到右的瓷砖

html - 根据宽度调整固定元素的底部属性

jQuery .each 和 div 的高度

css - 如何在 Dojo DataGrid 中增加/减小字体大小

c# - 如果该行项为真,如何使数据网格的一行变为粗体?

wpf - 如何删除额外的列Datagrid