【问题标题】:Silverlight Grid Column widthsSilverlight 网格列宽
【发布时间】:2012-08-28 15:11:22
【问题描述】:

我有一个包含三列的 Silverlight 5.0 网格,定义为宽度 "Auto", "*", and "Auto"。在第二列中,我有另一个四列网格,宽度为"25*"。这四列中的每一列都是一个 ComboBox。

即使宽度都定义相同,组合框“自动”会自行调整大小,当我选择一个时,框本身会缩小到比向下箭头大,尽管项目的大小适合。

<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*,ComboBoxes 的行为不是这样。

经过进一步观察,似乎是内部网格中的HorizontalAlignment="Center" 是罪魁祸首。如果我删除它,组合框会恢复到保持它们的大小,但它们会占据整个外列 1,而我希望它们占据必要的空间,然后在外列中居中。

【问题讨论】:

  • 我在解析您到底想要什么时遇到了一些麻烦。您希望 2 个组合框以网格为中心,只占用它们必要的空间?
  • @DanTheMan - (实际上有四个组合框,我只是没有重复定义。)我想要的是三列(一个标签,一组组合框和一个按钮)中间列有四个组合框。组合框应具有相同的宽度(Width="25*"),总共只占用它们必要的空间,然后它们中的四个在外部网格的中间列居中。
  • @Rico - 带有星号的值只是相对的。我使用 25* 还是 0.25* 没有区别。

标签: silverlight


【解决方案1】:

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

这在 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 似乎在做你想做的事情。

【讨论】:

  • 问题并不是让所有的组合框都具有相同的宽度。我可以通过将每个 ColumnDefinition Width 设置为 1* 来管理它。真正的问题是试图将它们集中在外部网格中。如果我将 Horizo​​ntalAlignment=Center 应用于内部网格,则行为会从恒定列宽更改为可变宽度(就像自动一样),并且选择时组合框会缩小到最小宽度。无论是否处理 SizeChanged,此行为都是相同的。如果我删除居中,所有组合框的宽度都是统一的,但它们一起占用了外部网格列中的所有空间
  • 我当前的解决方法是再添加两个列定义,一个在组合框之前,一个在组合框之后。设置它们的宽度然后让我在时尚之后“居中”;我只需要通过这种方式反复试验对 ColumnDefinition 宽度进行硬编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多