在我的 .Net Maui 项目中,我在 ControlTemplate 中使用 CollectionView。实现如下所示:
<ContentView.ControlTemplate>
<ControlTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<SearchBar
x:Name="ObjectSearchBar"
Grid.Row="0"
IsSpellCheckEnabled="False"
Keyboard="Text"
Placeholder="{TemplateBinding SearchBarPlaceholderText}"
TextChanged="ObjectSearchBar_TextChanged" />
<CollectionView
x:Name="ObjectResultView"
Grid.Row="1"
Margin="10,10,10,10"
ItemSizingStrategy="MeasureAllItems"
ItemTemplate="{StaticResource templateSelector}"
ItemsLayout="VerticalList"
ItemsSource="{TemplateBinding DataSource}"
SelectionChanged="ObjectResultView_SelectionChanged"
SelectionMode="Single">
</CollectionView>
</Grid>
</ControlTemplate>
<ContentView.ControlTemplate>
我在 ContentPage 中使用此 ContentView。该页面包含 2 个 StackLayout,其实现如下所示:
<ContentPage.Content>
<Grid>
<StackLayout
HorizontalOptions="FillAndExpand"
IsVisible="{Binding AddNewSectionIsVisible, Converter {converter:InvertedBoolConverter}}"
Orientation="Vertical"
VerticalOptions="FillAndExpand">
<controls:ObjectSearchControl
DataSource="{Binding DataSource}"
FilterChangedCommand="{Binding FilterChangedCommand}"
HorizontalOptions="FillAndExpand"
ObjectSelectedCommand="{Binding SelectedCommand}"
SearchBarPlaceholderText="ABC"
VerticalOptions="FillAndExpand" />
</StackLayout>
<StackLayout
HorizontalOptions="FillAndExpand"
IsVisible="{Binding AddNewSectionIsVisible}"
Orientation="Vertical"
Style="{StaticResource rootStackLayout}"
VerticalOptions="Center">
....
</StackLayout>
</Grid>
</ContentPage.Content>
页面出现时仅显示其中一个 StackLayout。
因此,如果我将第二行的高度设置为固定值或将 CollectionView 的高度设置为固定值,滚动就可以正常工作。但是,如果我使用“*”或“自动”作为第二行的高度定义,CollectionView 将不再滚动。
请问,在这种情况下有人可以帮助我吗?我还尝试使用 ScrollViews,将 Stacklayouts 或 Grid 的 VerticalOptions 设置为“FillAndExpand”,就像 MS 文档中描述的那样,但似乎对我不起作用。
在 2023 年 3 月 29 日,所有最新的 Maui 库 (8.0.0-preview.2) 都遇到了同样的问题。
帮助我修复滚动问题的是将
VerticalOptions
设置为 FillAndExpand
选项
Fill
不起作用
<CollectionView ItemsSource="{Binding .}"
VerticalOptions="FillAndExpand">
</CollectionView>
通过重构布局,我找到了问题的解决方案。
我替换了所有
StackLayouts
到 Grids
并在我的控件中添加了 ScrollView
。
看来我的问题的原因是复杂的布局。
我认为布局逻辑未能实现collectionview应该滚动。
尝试修复#1
尝试这 2 个改变:
<ContentPage.Content>
<!-- 1) "*": make sure row 0 takes all vertical space. -->
<Grid RowDefinitions="*">
<!-- 2) remove the surrounding StackLayout, to simplify layout logic. -->
<controls:ObjectSearchControl
IsVisible="{Binding AddNewSectionIsVisible, Converter {converter:InvertedBoolConverter}}"
DataSource="{Binding DataSource}"
FilterChangedCommand="{Binding FilterChangedCommand}"
HorizontalOptions="FillAndExpand"
ObjectSelectedCommand="{Binding SelectedCommand}"
SearchBarPlaceholderText="ABC"
VerticalOptions="FillAndExpand" />
测试 #1 是否不起作用
如果上述方法没有帮助,请进行此测试:
<controls:ObjectSearchControl
IsVisible="True"
... and set the other stacklayout to `IsVisible="False"`.
也就是说,作为测试,在从构造函数调用
InitializeComponent
之前强制该控件可见。这应该会导致 CollectionView 被正确标记为滚动。
需要此测试的结果,才能知道下一步要采取什么方法。
尝试修复 #2 待定
如果#1没有帮助,那是因为当页面第一次布局时,CollectionView没有被标记为需要滚动。
这可能是由动态
IsVisible
属性引起的,也可能是由 DataSource
具有任何内容之前发生的布局引起的。
这是 CollectionView 中的一个微妙错误,在其他情况下也曾出现过。
待定:研究早期的问答,以确定最简单的修复方法。
这不是一个错误,本来就是这样的..