Сетка внутри StackPanel: почему auto и * ведут себя странно? - PullRequest
10 голосов
/ 19 ноября 2011

Мой поиск в Google и stackoverflow провалился, поэтому я представляю сообществу этот вопрос.

(Все это создается с использованием VS2010 и .NET 4.0 в пустом стандартном решении WPF)

Рассмотрим следующий XAML:

<StackPanel Orientation="Horizontal">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <Border Name="aborder" Grid.Column="0" Grid.ColumnSpan="2" 
                    Background="Red" Width="200"/>
        <Border Name="aborder2" Background="Green"/>

    </Grid>
</StackPanel>

Какой бы вы предсказали ширину "aborder2"?

Если вы догадались «20 пикселей», вы ошиблись бы. Правильный ответ - 110 пикселей.

Рассмотрим этот XAML:

    <StackPanel Orientation="Horizontal">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>

        <Border Name="aborder" Grid.Column="0" Grid.ColumnSpan="2" 
                    Background="Red" Width="200"/>
        <Border Name="aborder2" Background="Green"/>

    </Grid>
</StackPanel>

Какой бы вы предсказали ширину "aborder2"?

Если вы угадали 20 или 110 пикселей, вы ошибаетесь. Правильный ответ 200 пикселей.

Я не могу понять это, и это сводит меня с ума. Кажется, что ответ должен быть очевидным; очевидно, существует некоторое взаимодействие между автоматически заполняющимся столбцом сетки и панелью стека, которое приводит к тому, что сетка выходит из строя. Но это, похоже, не имеет смысла смысл - какие бы правила ни управляли этим поведением, они кажутся произвольными. Почему 110 пикселей? Почему не 109 пикселей или 100 пикселей? Я бы понял, если авторазмерный столбец не раскрылся полностью или что-то в этом роде, но если столбец с фиксированной шириной случайно проигнорирует его ширину, я получаю сгоревшую оболочку разработчика.

Буду очень признателен за любую помощь или путеводные огни!

Ответы [ 2 ]

3 голосов
/ 19 ноября 2011

Я понятия не имею, почему первый пример не рендерится правильно

Второй - потому что Auto означает "тот же размер, что и содержимое", но у вас нет ничего в Column2, поэтому Column2 будет отображатьсяв 0px.У вас есть что-то в Column1, которое охватывает 2 ячейки, но так как Column2 отображается в 0 px, это означает, что Column1 растягивается до 200 px.По умолчанию Grid расширяет своих дочерних элементов, чтобы заполнить все доступное пространство в ячейке, так что aborder2 растягивается до 200px вместо 20.

Я думаю, что первый пример может быть похожей ситуацией, когда Column2рендеринг в 0px, потому что у него нет контента, однако я не уверен, почему он устанавливает aborder2 на ширину 110. Кажется, что 110 приходит от (GridWidth / TotalColumns) + (1stColumnWidth / TotalColumns * NumberOfStarColumns), поэтому я думаю, что это ошибка.

В качестве примечания вы можете установить MaxWidth="20" для Column1 так, чтобы Column1 всегда отображался как 20px

1 голос
/ 19 ноября 2011

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

Чтобы попытаться разгадать тайну происхождения 110, я предполагаю (200 - 20) / 2 + 20

РЕДАКТИРОВАТЬ: я пробовал несколько других формул, но это незадержка, выглядит больше как:

(200 + 20) / 2

...