@JesuX的答案是更好的方法 - 如果做得對。下面ListView
子類正常工作對我來說:
public sealed class IntegralItemsListView : ListView
{
protected override Size MeasureOverride(Size availableSize)
{
Size size = base.MeasureOverride(availableSize);
double height = 0;
if (Items != null)
{
for (int i = 0; i < Items.Count; ++i)
{
UIElement itemContainer = (UIElement)ContainerFromIndex(i);
if (itemContainer == null)
{
break;
}
itemContainer.Measure(availableSize);
double childHeight = itemContainer.DesiredSize.Height;
if (height + childHeight > size.Height)
{
break;
}
height += childHeight;
}
}
size.Height = height;
return size;
}
}
一個警告 - 如果你撲通的IntegralItemsListView
爲Grid
,它將有
VerticalAlignment="Stretch"
默認情況下,這違背了這個類的目的。
另外:如果項目是高度統一的,該方法可以明顯被簡化:
protected override Size MeasureOverride(Size availableSize)
{
Size size = base.MeasureOverride(availableSize);
size.Height = (int)(size.Height/ItemHeight) * ItemHeight;
return size;
}
我覺得選項#1,你提到的可以做一些額外的代碼來處理規模分辨率/方向/視圖狀態(填充,捕捉等)的變化。 – Krishna
這裏要做的一件簡單的事情是,在運行時獲取列表的ActualHeight,然後獲取單個列表項目的ActualHeight,然後可以計算可用空間中可容納多少項目並更改列表的高度。我不確定這是否是最好的解決方案,但我確實使用過它並且對我來說工作得很好。 –
@NovitchiS謝謝,這似乎是目前最簡單的方法...如果你發佈這個答案我會接受這個作爲我的問題的答案。 – Hallgeir