当中间列具有MinWidth时,为什么WPF Grid不能平均共享空间?

时间:2010-09-15 13:43:04

标签: wpf

在这个例子中,第一列得到100,接下来的两列得到50,这是预期的行为。

<Grid Width="200" Height="200">
    <Grid.ColumnDefinitions>
        <ColumnDefinition MinWidth="100" />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Border Background="Red" Grid.Column="0" />
    <Border Background="Yellow" Grid.Column="1" />
    <Border Background="Blue" Grid.Column="2" />
</Grid>

alt text

如果我将MinWidth移动到中间列......

<Grid Width="200" Height="200">
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition MinWidth="100" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Border Background="Red" Grid.Column="0" />
    <Border Background="Yellow" Grid.Column="1" />
    <Border Background="Blue" Grid.Column="2" />
</Grid>

...然后第一列得到33.3,最后一列66.6看起来很奇怪。不知道为什么这应该改变网格的行为。我希望第0列和第2列各得50个。

alt text

更新:我理解为什么会发生这种情况,但是想知道是否有人认为这是一个错误(特别是因为Silverlight中的行为不同)

4 个答案:

答案 0 :(得分:3)

只有当您有一个中心列时才会出现此问题,这意味着您为网格定义了奇数列。我不确定为什么会这样,我也不认为这是故意的行为。但是,另一种解决方法是始终确保定义偶数列,即使您只使用奇数列(使用MaxWidth = 0隐藏额外列)。

    <Grid Width="200" Height="200">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" MinWidth="100"/>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" MaxWidth="0"/> <!--Workaround-->
        </Grid.ColumnDefinitions>

        <Border Grid.Column="0" Background="Red"/>
        <Border Grid.Column="1" Background="Yellow"/>
        <Border Grid.Column="2" Background="Blue"/>
    </Grid>

这里的缺点是你的网格中有一个空列。优点是您可以获得预期的空间分布行为。

答案 1 :(得分:1)

只是一个更新..我已尝试使用.NET 3.5 / 4.0 Silverlight 3/4的组合的XAML片段,但仍然无法获得第二个示例的相等宽度...

此XAML是解决该问题的唯一途径:

<Grid Width="200" Height="200">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width=".5*" />
            <ColumnDefinition MinWidth="100" />
            <ColumnDefinition Width=".5*" />
        </Grid.ColumnDefinitions>
        <Border Background="Red" Grid.Column="0" />
        <Border Background="Yellow" Grid.Column="1" />
        <Border Background="Blue" Grid.Column="2" />
    </Grid>

你身边的人有任何更新吗?

答案 2 :(得分:0)

不确定问题究竟是什么,但这两个网格的行为方式与您希望的一样。我比第一个更喜欢第二个,因为它明确指定第一列和第三列应该平等地占用剩余空间。

<Grid Width="200" Height="200">
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition MinWidth="100" Width="Auto" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Border Background="Red" Grid.Column="0" />
    <Border Background="Yellow" Grid.Column="1" />
    <Border Background="Blue" Grid.Column="2" />
</Grid>



<Grid Width="200" Height="200">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*" />
        <ColumnDefinition MinWidth="100" Width="Auto" />
        <ColumnDefinition Width="1*" />
    </Grid.ColumnDefinitions>
    <Border Background="Red" Grid.Column="0" />
    <Border Background="Yellow" Grid.Column="1" />
    <Border Background="Blue" Grid.Column="2" />
</Grid>

答案 3 :(得分:0)

如果您想要相等的宽度,则无法使用自动。您必须将每列的宽度明确设置为所需的比例,对于每列需要“.3 *”的3列。 如果计算的宽度小于MinWidth,则MinWidth优先。