Почему два столбца в таблице WPF с * не имеют одинаковый размер? - PullRequest
12 голосов
/ 01 февраля 2012

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

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

Ответы [ 4 ]

11 голосов
/ 01 февраля 2012

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

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

"Звезда (*):

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

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

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

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

4 голосов
/ 02 февраля 2012

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

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

0 голосов
/ 01 февраля 2012

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

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

...