如何让Xamarin.Forms ListView项列宽度与表头列宽度一致
解决Xamarin.Forms ListView表头与项列宽匹配问题
首先修正你代码中的几个拼写和语法错误:
- 控件名统一为
ListView(原代码写成Listview) Header拼写正确(原代码写成Heder)LineBreakMode值应为TailTruncation(原代码写成TailTrumcation)- 日期属性名修正为
ReleaseDate(原代码写成RealiseDate) Grid.ColumnDefinitions需用正确嵌套格式,将多个<ColumnDefinition>放在同一<Grid.ColumnDefinitions>标签内
接下来提供两种可靠的列宽同步方案:
方案一:通过绑定同步列宽
给表头Grid的列定义命名,然后在项的Grid中绑定对应列的宽度,确保两者完全一致:
<ListView> <ListView.Header> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition x:Name="HeaderColumn0" Width="1*"/> <ColumnDefinition x:Name="HeaderColumn1" Width="Auto"/> </Grid.ColumnDefinitions> <Label Text="Title of a book" Grid.Column="0" HorizontalOptions="StartAndExpand"/> <Label Text="Date" Grid.Column="1" HorizontalOptions="Center"/> </Grid> </ListView.Header> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="{Binding Source={x:Reference HeaderColumn0}, Path=Width}"/> <ColumnDefinition Width="{Binding Source={x:Reference HeaderColumn1}, Path=Width}"/> </Grid.ColumnDefinitions> <Label Text="{Binding Library}" Grid.Column="0" LineBreakMode="TailTruncation" HorizontalOptions="StartAndExpand"/> <Label Text="{Binding ReleaseDate}" Grid.Column="1" HorizontalOptions="Center"/> </Grid> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView>
方案二:使用共享列定义资源
将列定义作为页面资源,表头和项的Grid共同引用该资源,从根源保证列宽一致:
首先在页面资源中定义共享列:
<ContentPage.Resources> <ColumnDefinitionCollection x:Key="SharedColumnDefinitions"> <ColumnDefinition Width="1*"/> <ColumnDefinition Width="Auto"/> </ColumnDefinitionCollection> </ContentPage.Resources>
然后在ListView中引用该资源:
<ListView> <ListView.Header> <Grid ColumnDefinitions="{StaticResource SharedColumnDefinitions}"> <Label Text="Title of a book" Grid.Column="0" HorizontalOptions="StartAndExpand"/> <Label Text="Date" Grid.Column="1" HorizontalOptions="Center"/> </Grid> </ListView.Header> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <Grid ColumnDefinitions="{StaticResource SharedColumnDefinitions}"> <Label Text="{Binding Library}" Grid.Column="0" LineBreakMode="TailTruncation" HorizontalOptions="StartAndExpand"/> <Label Text="{Binding ReleaseDate}" Grid.Column="1" HorizontalOptions="Center"/> </Grid> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView>
注意:如果是静态填充项(而非绑定数据源),可将<ListView.ItemTemplate>替换为<ListView.Items>并直接添加<ViewCell>,但推荐使用ItemTemplate配合数据源的方式,更符合Xamarin.Forms的设计规范。
内容的提问来源于stack exchange,提问作者Radek
相关产品推荐
相关产品推荐

