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

С помощью следующего кода я ожидал закончить двумя 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>

Функция автоматического определения размера WPF сводит меня с ума... есть идеи? Благодарю.

РЕДАКТИРОВАТЬ: Все сделано в VS2008, на случай, если это имеет значение.

4 ответа

Решение

Алекс. Я нашел точную причину происходящего, и я нашел решение в удачном ударе. Просто меняя * на 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>

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

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

"Звезда (*):

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

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

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

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

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

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

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

Другие вопросы по тегам