Grid SharedSizeGroup - 列正在弹跳,在无限循环中调整大小

时间:2011-11-07 14:04:07

标签: wpf grid issharedsizescope sharedsizegroup

我需要包含水平和垂直标题的表(简单的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(分别为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共享它的宽度。但是当我运行程序时,列会在无限循环中弹跳和调整大小。 Row的高度分享工作正常。哪个可能是问题?

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

2 个答案:

答案 0 :(得分:2)

网格控件的自动调整算法有时会很挑剔。

您是否尝试在每个列/行上设置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>

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

答案 1 :(得分:2)

如果一个网格有许多SharedSizeGroup列,则生成的布局会执行指数级增加的传递次数以尝试对其进行排序。某个地方有人说微软承认了这个错误,但我无法找到它的细节。

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

由于你的网格是二维的,这将更难。当你动态添加控件时,也许你可以让一个垂直StackPanel保持水平StackPanels保持较小的网格?