Сетка SharedSizeGroup - столбцы отскакивают, изменяя размеры в бесконечном цикле - PullRequest
8 голосов
/ 07 ноября 2011

Мне нужна таблица с горизонтальным и вертикальным заголовком (простой 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), и мне нужно определить размер Header-ColumnDefinitions в соответствии с Content-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);
    ...

Таким образом, заголовок-столбец должен делиться шириной с столбцом содержимого. Но когда я запускаю программу, столбцы отскакивают и изменяют размеры в бесконечном цикле. Распределение высоты строки работает нормально. Где может быть проблема?

РЕДАКТИРОВАТЬ только столбцы в заголовке (grdHorizontHeader) изменяют размер. Столбцы в grdContent имеют правильную и стабильную ширину.

Ответы [ 2 ]

3 голосов
/ 21 апреля 2015

Если в одной сетке есть много столбцов SharedSizeGroup, результирующий макет выполняет экспоненциально растущее число проходов, чтобы попытаться их отсортировать. Кто-то где-то сказал, что Microsoft признала ошибку, но я не смог найти подробности об этом.

Чтобы решить эту проблему, я разбил свою сетку на более мелкие сетки внутри StackPanel. Это снова сделало макет быстрым и сохранило общий размер.

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

3 голосов
/ 01 ноября 2013

Алгоритм управления Grid для автоматического определения размера иногда может быть привередливым.

Вы пытались установить 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>

Не супер элегантный, но исправил эту проблему для нас.

...