8

我需要带有水平和垂直标题的表格(简单的 PivotGrid)。我在这里发现了一些类似(或几乎相同)的问题,但没有人给出解决方案。在 XAML 中,我定义了这个结构:

<Grid x:Name="grdMain" Background="White" Grid.IsSharedSizeScope="True">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid Grid.Row="0" Grid.Column="1" x:Name="grdHorizontalHeader">
        <!-- place for column definitions and header labels defined in code -->
    </Grid>
    <Grid Grid.Row="1" Grid.Column="0" x:Name="grdVerticalHeader">
        <!-- place for column definitions and header labels defined in code -->
    </Grid>
    <Grid Grid.Row="1" Grid.Column="1" x:Name="grdContent">
        <!-- place for column definitions and header labels defined in code -->
    </Grid>
</Grid>

所以两个标题都由带有一些ColumnDefinitions(resp.RowDefinitions)的网格组成,我需要根据Content-ColumnDefinitions来调整Header-ColumnDefinitions的大小。我在代码中这样做:

foreach (var row in myColumnSource)
{

    // Content columns definitions

    var cD = new ColumnDefinition();
    cD.Width = GridLength.Auto;
    cD.SharedSizeGroup = "ColumnSharedSizeGroup" + row.Value;
    this.grdContent.ColumnDefinitions.Add(cD);

    // Header columns definitions

    var cD2 = new ColumnDefinition();
    cD2.Width = GridLength.Auto;
    cD2.SharedSizeGroup = "ColumnSharedSizeGroup" + row.Value;
    this.grdHorizontalHeader.ColumnDefinitions.Add(cD2);
    ...

所以 Header-Column 应该与 Content-Column 共享它的 Width。但是当我运行程序时,列在无限循环中弹跳和调整大小。行的高度共享工作正常。问题可能出在哪里?

仅编辑标题 (grdHorizo​​ntalHeader) 中的列正在调整大小。grdContent 中的列具有正确且稳定的宽度。

4

2 回答 2

3

如果一个网格有许多 SharedSizeGroup 列,则生成的布局将执行呈指数增长的传递次数以尝试将它们排序。有人说微软承认了这个错误,但我找不到它的细节。

为了解决这个问题,我在 StackPanel 中将网格分解为更小的网格。这使布局再次快速并保留了共享大小。

由于您的网格是二维的,因此这会更难。当您动态添加控件时,也许您可​​以让一个垂直 StackPanel 持有水平 StackPanel 持有更小的网格?

于 2015-04-21T20:29:31.387 回答
3

网格控件的自动调整大小算法有时可能很挑剔。

您是否尝试过在每个列/行上设置 MinWidth?

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" MinWidth="30" />
    <ColumnDefinition Width="Auto" MinWidth="30" />
    <ColumnDefinition Width="Auto" MinWidth="30" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
    <RowDefinition Height="Auto" MinHeight="15" />
    <RowDefinition Height="Auto" MinHeight="15" />
    <RowDefinition Height="Auto" MinHeight="15" />
</Grid.RowDefinitions>

不是超级优雅,但为我们解决了同样的问题。

于 2013-11-01T15:09:56.560 回答