如何使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
}
}
答案 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是正确的,因为您最好将所有这些内容封装在自定义面板中。子项还需要接受调整大小,而不是使用无法覆盖的固定高度。
理论上,每个孩子都可以检查父母渲染的身高和物品数量,然后给它一定百分比的渲染高度,可以使用并适当调整大小,但是会想到凌乱。