Silverlight网格列宽

时间:2012-08-28 15:11:22

标签: silverlight

我有一个Silverlight 5.0 Grid,有三列,宽度为"Auto", "*", and "Auto"。在第二列内部,我有另一个有四列的Grid,宽度为"25*"。这四列中的每一列都是ComboBox。

即使宽度都定义相同,ComboBoxes" Auto"尺寸本身,当我选择一个时,框本身会缩小到比向下箭头更大,尽管这些项目的大小适合。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
<ContentControl Grid.Column="0" FontSize="20" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="10,1,0,1">
    <ContentPresenter Content="This is a Label" />
</ContentControl>
    <Grid Grid.Column="1" HorizontalAlignment="Center">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="25*"/>
            <ColumnDefinition Width="25*"/>
            <ColumnDefinition Width="25*"/>
            <ColumnDefinition Width="25*"/>
        </Grid.ColumnDefinitions>
        <ComboBox Grid.Column="0" Name="comboView" FontSize="14" Margin="2,1,2,1" >
            <ComboBox.Items>
                <ComboBoxItem Content="Item1" IsSelected="True" />
                <ComboBoxItem Content="Item2" />
            </ComboBox.Items>
        </ComboBox>
        <ComboBox Grid.Column="1" Name="comboField" FontSize="14" Margin="2,1,2,1" >
            <ComboBox.Items>
                <ComboBoxItem Content="Field1" IsSelected="True" />
                <ComboBoxItem Content="Field2" />
            </ComboBox.Items>
        </ComboBox>

...

我错过了什么?当我只有一个网格时,第一列设置为Auto,其余所有设置为Width=9*,ComboBox就不会这样。

进一步观察后,内部网格中的HorizontalAlignment="Center"似乎是罪魁祸首。如果我删除它,ComboBox会返回保留它们的大小,但是当我希望它们占用它们所需的空间然后在外部列中居中时它们会占据整个外部的第1列。

1 个答案:

答案 0 :(得分:0)

如果我现在理解正确,你最大的问题是你想要所有的组合框都是相同的宽度,都占用相同的空间(即:所有大小都等于具有最大尺寸的组合框)。我相信你已经把一切都拉直了。

这在WPF中非常容易;他们有一个名为“IsSharedSizeScope”的属性,可以均匀地分配网格宽度。

Silverlight中没有此类属性。要做到这一点,你可能需要绑定每个的大小,并在后面的代码中执行。它有点hacky,但它应该工作。对所有人来说都是这样的:

<ComboBox Grid.Column="1" Name="comboField" FontSize="14" Margin="2,1,2,1" Width="{Binding Path=Width}" SizeChanged="comboField_SizeChanged">

然后在代码背后:

GridLength Width = new GridLength(10);

private void comboField_SizeChanged(object sender, SizeChangedEventArgs e)
{
    if (e.NewSize.Width > len.Value)
    {
        Width = new GridLength( e.NewSize.Width );
    }
}

编辑: 还有this library似乎做了你想要的同样的事情。