Подтвердить что ты не робот

Почему два столбца в WPF Grid с * не имеют одинакового размера?

со следующим кодом, который, как я ожидал, должен заканчиваться двумя ListBox с той же шириной, что и в случае с двумя аргументами для столбцов, с помощью команды With = "*"

Вместо этого выглядит, что размер определяется размером текста в ListBox, который не имеет смысла, поскольку этот текст намного меньше, чем ListBox, и поэтому TextBlock имеет достаточно места для размещения текста.

<Window x:Class="UnderstandSizing.Window5"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window5" 
SizeToContent="WidthAndHeight"
ResizeMode="NoResize" >

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

    <TextBlock Text="Text1longer" Grid.Row="0" Grid.Column="0" x:Name="Test1" />
    <TextBlock Text="Text1" Grid.Row="0" Grid.Column="2" />
    <ListBox Grid.Row="1" Grid.Column="0" Height="150" />

    <ListBox Grid.Row="1" Grid.Column="2" Height="150" />
    <TextBlock Grid.Row="2" Grid.ColumnSpan="3"  Text="This textblock sets the max width" Width="300" />
</Grid>
</Window>

enter image description here

Автоматическая функция настройки WPF сводит меня с ума... любые идеи? Спасибо.

EDIT: все сделано в VS2008, на всякий случай это важно.

4b9b3361

Ответ 1

Алекс. А нашел точную причину происходящего, и я нашел решение в удачном ударе. Просто изменив * для 0, я получаю ожидаемый результат (странно, если вы спросите меня):

<Window x:Class="UnderstandSizing.Window5"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window5" 
SizeToContent="WidthAndHeight"
ResizeMode="NoResize" >

<Grid>  
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="0" />
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="0" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
</Grid.RowDefinitions>

<TextBlock Text="Text1longer" Grid.Row="0" Grid.Column="0" x:Name="Test1" />
<TextBlock Text="Text1" Grid.Row="0" Grid.Column="2" />
<ListBox Grid.Row="1" Grid.Column="0" Height="150" />

<ListBox Grid.Row="1" Grid.Column="2" Height="150" />
<TextBlock Grid.Row="2" Grid.ColumnSpan="3"  Text="This textblock sets the max width" Width="300" />
</Grid>
</Window>

Ответ 2

Посмотрите на это:

http://www.wpftutorial.net/GridLayout.html

"Звезда (*):

Занимает столько места, сколько доступно (после заполнения всех столбцов авто и фиксированного размера), пропорционально разделенных по всем столбцам звездного размера. Таким образом, 3 */5 * означает то же самое, что и 30 */50 *. Помните, что размер звезды не работает, если размер сетки вычисляется на основе его содержимого. "

Это в вашем коде. Я подозреваю, что это также причина, по которой она выглядела хорошо для других, проверяющих ее, если они вставляли сетку в окно размером более 300 пикселей, установленное вашим TextBlock. Я получаю ту же проблему, что и вы, если я использую точно тот же XAML.

Изменить: Итак, для "почему". См. Этот вопрос для возможного альтернативного решения: Wpf: Grid: Как я могу использовать ширину ширины столбца/строки?

Самый последний ответ (а не тот, который выбрал аскер), по-видимому, наиболее полезен в этом случае.

Ответ 3

Для меня это работает отлично, во время выполнения. Не доверяйте дизайнерам графического интерфейса, они враги.

Ответ 4

Работает для меня во время разработки и во время выполнения.

Дизайнер GUI не должен показывать эти размеры пикселей. Для меня это показывает 1*, что означает, что ваш снимок экрана отличается от вашего кода.