未定义父级大小时,网格宽度“*”的行为不符合预期

时间:2016-05-26 09:32:21

标签: wpf

我在一个对话框中有一组控件,我想自动调整大小。一切正常,直到我尝试使用均匀间隔的网格宽度重新排列事物。

这是XAML:

<Grid Margin="20" >
    <Grid.RowDefinitions>
        <RowDefinition Height="AUTO" />
        <RowDefinition Height="AUTO" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid>
         ...left controls
    </Grid>
    <Border BorderThickness="1" BorderBrush="Gray" Grid.Column="1" Margin="0,10,0,5">
         ...right controls
    </Border>
    <Grid Grid.Row="2" Grid.ColumnSpan="2>
         ...okay and cancel
    </Grid>
</Grid>

结果如下:

enter image description here

不是我所期待的。右栏有一个很小的宽度,由于某种原因它没有听到“*”并使它等于另一列的一半。

如果我将Width="450"放在最高的网格或UserControl上(或者在运行时,调整其所在窗口的大小!)一切都“跳”并且我得到了我期望的,两列均匀间隔:

enter image description here

但是现在它没有响应重新调整大小,或者更大内容的自动调整大小(除了在父容器拉伸时不会拉伸)如果我在等间距之后我可以使用共享大小组。我有什么问题或是Width="*"的预期行为吗?

2 个答案:

答案 0 :(得分:1)

当您的外部网格托管在未定义宽度的容器中时,实际宽度将是后代的结果。也就是说,(外部)网格测量传递将“询问”到右边的列(边框):“我给你你想要的任何空间:你需要多少?”。只要Border片段不需要任何特定大小,结果就是默认值(在大多数情况下为零)。因此崩溃的行为。

基本上,您应该定义外部网格宽度,或者第二列宽度(通过列中的任何内容来表示它需要多少空间)。

答案 1 :(得分:0)

你是对的*意味着把大小与网格成比例。它会发生,因为您的最高Grid空间不够宽(当您设置Width="450"时,Grid变得更宽)。

如果Window中只有一个网格,那么theSecondColumn将占据所有位置(根据需要会更宽):

<Window x:Class="DataGridAddedColumns.MainWindow"
    <!-- The code is omitted for the brevity -->
        Title="MainWindow" Height="550" Width="525"  
          WindowStartupLocation="CenterScreen">
    <Grid Name="grid">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Name="theSecondColumn" Width="*"/>
         </Grid.ColumnDefinitions>
    <Grid>
</Window>