Xamarin - CollectionView VerticalItemSpacing 不工作
Xamarin - CollectionView VerticalItemSpacing not working
我不知道哪里出了问题,我测试了几个代码变体,其中 none 个有效。我也尝试过使用 Frame 和 StackLayout 的变体。
<ScrollView VerticalOptions="StartAndExpand" Orientation="Vertical">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<CollectionView Grid.Row="0" x:Name="StockCards_CollectionView" ItemsSource="{Binding lc_ReleaseBill.Items}" SelectionChangedCommand="{Binding OnCollectionViewSelectionChanged}" EmptyView="List is empty." SelectionMode="Single" SelectedItem="{Binding SelectedStockCard, Mode=TwoWay}">
<CollectionView.ItemsLayout>
<GridItemsLayout Orientation="Vertical" VerticalItemSpacing="20"/>
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.Column="0" Text="{Binding Name}" FontAttributes="Bold" VerticalOptions="Start" TextColor="White"/>
<Label Grid.Row="1" Grid.Column="0" Text="{Binding Unit}" FontAttributes="Italic" VerticalOptions="Start" TextColor="White"/>
<Label Grid.Row="0" Grid.Column="1" Text="{Binding Price_WithVAT_Unit}" FontAttributes="Bold" HorizontalOptions="End" FontSize="19" TextColor="#00c8df"/>
<Label Grid.Row="1" Grid.Column="1" Text="{Binding Amount}" FontAttributes="Bold" HorizontalOptions="End" TextColor="White"/>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</Grid>
</ScrollView>
运行 在 Xamarin.Forms 4.5.0.356 上,同样的结果在 4.4.0.991640.
您可以尝试将边距添加到 ContentView 中的 DataTemplate 内容
<CollectionView Grid.Row="0" x:Name="StockCards_CollectionView" ItemsSource="{Binding lc_ReleaseBill.Items}" SelectionChangedCommand="{Binding OnCollectionViewSelectionChanged}" EmptyView="List is empty." SelectionMode="Single" SelectedItem="{Binding SelectedStockCard, Mode=TwoWay}">
<CollectionView.ItemsLayout>
<GridItemsLayout Orientation="Vertical"/>
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate>
<ContentView>
<Grid Margin="0,0,0,20">
...
</Grid>
<(ContentView>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
此外,您应该尝试使用 ItemSpacing="20"
而不是 VerticalItemSpacing
编辑:由于 ItemSpacing 确实有效,但只有在其中包含更多项目足以前后滚动时,我才会尝试这种技术:
将 IsVisible
属性 设置为 false,在您的 Collection 有数据后,将其设置为 true:
<CollectionView IsVisible="{Binding CollectionHasData}" Grid.Row="0" x:Name="StockCards_CollectionView" ItemsSource="{Binding lc_ReleaseBill.Items}" SelectionChangedCommand="{Binding OnCollectionViewSelectionChanged}" EmptyView="List is empty." SelectionMode="Single" SelectedItem="{Binding SelectedStockCard, Mode=TwoWay}">
private bool _collectionHasData;
public bool CollectionHasData
{
get => _item;
set { _collectionHasData = value; }
}
...
lc_ReleaseBill.Items = Data;
CollectionHasData = true;
我不知道你是如何获取数据的,如果你设置它或者对象已经有数据,但关键是,当你的项目有一些值时,将 bool 设置为 true
我通过在代码中设置 Collection View Item Spacing 来修复它,这并不理想,但比在 Collection View 内部的 Grid 上设置边距要好。
CollectionView.ItemsLayout = new LinearItemsLayout(ItemsLayoutOrientation.Vertical)
{
ItemSpacing = 20
};
对于添加的新项目,边距和间距不会更新,更新它们的唯一方法是滚动关闭然后返回屏幕。
我不知道哪里出了问题,我测试了几个代码变体,其中 none 个有效。我也尝试过使用 Frame 和 StackLayout 的变体。
<ScrollView VerticalOptions="StartAndExpand" Orientation="Vertical">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<CollectionView Grid.Row="0" x:Name="StockCards_CollectionView" ItemsSource="{Binding lc_ReleaseBill.Items}" SelectionChangedCommand="{Binding OnCollectionViewSelectionChanged}" EmptyView="List is empty." SelectionMode="Single" SelectedItem="{Binding SelectedStockCard, Mode=TwoWay}">
<CollectionView.ItemsLayout>
<GridItemsLayout Orientation="Vertical" VerticalItemSpacing="20"/>
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.Column="0" Text="{Binding Name}" FontAttributes="Bold" VerticalOptions="Start" TextColor="White"/>
<Label Grid.Row="1" Grid.Column="0" Text="{Binding Unit}" FontAttributes="Italic" VerticalOptions="Start" TextColor="White"/>
<Label Grid.Row="0" Grid.Column="1" Text="{Binding Price_WithVAT_Unit}" FontAttributes="Bold" HorizontalOptions="End" FontSize="19" TextColor="#00c8df"/>
<Label Grid.Row="1" Grid.Column="1" Text="{Binding Amount}" FontAttributes="Bold" HorizontalOptions="End" TextColor="White"/>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</Grid>
</ScrollView>
运行 在 Xamarin.Forms 4.5.0.356 上,同样的结果在 4.4.0.991640.
您可以尝试将边距添加到 ContentView 中的 DataTemplate 内容
<CollectionView Grid.Row="0" x:Name="StockCards_CollectionView" ItemsSource="{Binding lc_ReleaseBill.Items}" SelectionChangedCommand="{Binding OnCollectionViewSelectionChanged}" EmptyView="List is empty." SelectionMode="Single" SelectedItem="{Binding SelectedStockCard, Mode=TwoWay}">
<CollectionView.ItemsLayout>
<GridItemsLayout Orientation="Vertical"/>
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate>
<ContentView>
<Grid Margin="0,0,0,20">
...
</Grid>
<(ContentView>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
此外,您应该尝试使用 ItemSpacing="20"
而不是 VerticalItemSpacing
编辑:由于 ItemSpacing 确实有效,但只有在其中包含更多项目足以前后滚动时,我才会尝试这种技术:
将 IsVisible
属性 设置为 false,在您的 Collection 有数据后,将其设置为 true:
<CollectionView IsVisible="{Binding CollectionHasData}" Grid.Row="0" x:Name="StockCards_CollectionView" ItemsSource="{Binding lc_ReleaseBill.Items}" SelectionChangedCommand="{Binding OnCollectionViewSelectionChanged}" EmptyView="List is empty." SelectionMode="Single" SelectedItem="{Binding SelectedStockCard, Mode=TwoWay}">
private bool _collectionHasData;
public bool CollectionHasData
{
get => _item;
set { _collectionHasData = value; }
}
...
lc_ReleaseBill.Items = Data;
CollectionHasData = true;
我不知道你是如何获取数据的,如果你设置它或者对象已经有数据,但关键是,当你的项目有一些值时,将 bool 设置为 true
我通过在代码中设置 Collection View Item Spacing 来修复它,这并不理想,但比在 Collection View 内部的 Grid 上设置边距要好。
CollectionView.ItemsLayout = new LinearItemsLayout(ItemsLayoutOrientation.Vertical)
{
ItemSpacing = 20
};
对于添加的新项目,边距和间距不会更新,更新它们的唯一方法是滚动关闭然后返回屏幕。