Silverlight - 如何使列表框中的每个项目具有相同的高度?

时间:2009-07-23 16:09:56

标签: c# .net wpf silverlight

如何使silverlight列表框中的所有项目具有相同的大小,并使它们占据列表框高度的100%。即1个项目将是列表框的高度,2个项目将是列表框高度的50%,等等...

编辑 - 这是代码

public class UniformPanel : Panel
{
    protected override Size MeasureOverride(Size availableSize)
    {
        Size panelDesiredSize = new Size();

        for (int i = 0; i < Children.Count; i++)
        {
            UIElement child = Children[i];
            child.Measure(availableSize);
            var childDesiredSize = child.DesiredSize;
            panelDesiredSize.Height += childDesiredSize.Height;
            if (panelDesiredSize.Width < childDesiredSize.Width)
            {
                panelDesiredSize.Width = childDesiredSize.Width;
            }
        }

        return panelDesiredSize;
    }
    protected override Size ArrangeOverride(Size finalSize)
    {
        double height = finalSize.Height/Children.Count;
        for (int i = 0; i < Children.Count; i++)
        {
            UIElement child = Children[i];
            Size size = new Size(finalSize.Width, height);
            child.Arrange(new Rect(new Point(0, i * height), size));
        }
        return finalSize; // Returns the final Arranged size
    }
}

2 个答案:

答案 0 :(得分:1)

我明白了,你的要求只是让每个项目得到TotalHeight / itemsCount正确。在这种情况下你可以通过使Columns = 1来使用UniformGrid(已经作为平台的一部分存在) 使用以下XAML

        <ListBox VerticalContentAlignment="Stretch"  HorizontalContentAlignment="Stretch">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid IsItemsHost="True" Columns="1"/>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
          <Button />
          <Button />
          <Button />
    </ListBox>

更新:silverlight没有UniformGrid,但你可以从WPF移植到Silverlight here

答案 1 :(得分:0)

我认为这不会是微不足道的,因为列表框具有无限高度,添加足够的项目,滚动条可以显示并且内容的高度增加。

列表框的rendersize.height将让您确定可用高度是多少,然后告诉子项目调整大小,但Jobi是正确的,因为您最好将所有这些内容封装在自定义面板中。子项还需要接受调整大小,而不是使用无法覆盖的固定高度。

理论上,每个孩子都可以检查父母渲染的身高和物品数量,然后给它一定百分比的渲染高度,可以使用并适当调整大小,但是会想到凌乱。