你要的ListViewItem
結合Height
(或MinHeight
)到ListView的ActualHeight
。當然,我們需要一個轉換到ActualHeight
轉換爲相同的高度爲每個項目:
<ListView x:Name="sportList" Grid.Row="0" Grid.Column="0"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.CanContentScroll="False" UseLayoutRounding="True">
<ListView.Resource>
<local:AutoFillHeightConverter x:Key="hc"/>
</ListView.Resource>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="MinHeight" Value="{Binding ActualHeight,
RelativeSource={RelativeSource AncestorType=ListView},
Converter={StaticResource hc}, [email protected]}"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" Margin="15,0,0,0" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
請注意,您的要求意味着我們不需要垂直滾動條。所以我們最好禁用或隱藏它。同時將CanContentScroll
設置爲false,並將UseLayoutRounding
設置爲true以獲得更好(更精確設置的高度)渲染。
這裏是AutoFillHeightConverter
類(即我們嵌入ListView的資源的情況下):
public class AutoFillHeightConverter : IValueConverter {
object IValueConverter.Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
var p = parameter as string;
var win = Application.Current.Windows.Cast<Window>()
.First(w => w.Name == p.Split('@')[0]);
var lv = win.FindName(p.Split('@')[1]) as ListView;
var lvh = Convert.ToDouble(value);
return lv.Items.Count == 0 ? Binding.DoNothing : (lvh/lv.Items.Count);
}
object IValueConverter.ConvertBack(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
備註綁定的ConverterParameter
,我們把它設置爲一個字符串。該字符串包括由@
分隔的2個部分。第一部分應該是Window的Name
,第二部分應該是ListView的Name
。我們需要這些名稱來訪問Convert
方法內的ListView實例來轉換高度。
如果你有很多需要滾動條的項目,你會如何處理? – 2014-10-30 01:19:42
@ ChobosaurusSoftware它將有一個固定的物品清單 – 2014-10-30 11:19:41