Почему два столбца в 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, на всякий случай это важно.
Ответы
Ответ 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*
, что означает, что ваш снимок экрана отличается от вашего кода.