CollectionView 在未设置 height 属性的情况下不会滚动

问题描述 投票:0回答:4

在我的 .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 文档中描述的那样,但似乎对我不起作用。

.net xaml xamarin maui
4个回答
9
投票

在 2023 年 3 月 29 日,所有最新的 Maui 库 (8.0.0-preview.2) 都遇到了同样的问题。

帮助我修复滚动问题的是将

VerticalOptions
设置为
FillAndExpand

选项

Fill
不起作用

<CollectionView ItemsSource="{Binding .}"
            VerticalOptions="FillAndExpand">
</CollectionView>

3
投票

通过重构布局,我找到了问题的解决方案。

我替换了所有

StackLayouts
Grids
并在我的控件中添加了
ScrollView
。 看来我的问题的原因是复杂的布局。


1
投票

我认为布局逻辑未能实现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 中的一个微妙错误,在其他情况下也曾出现过。

待定:研究早期的问答,以确定最简单的修复方法。


0
投票

这不是一个错误,本来就是这样的..

参见https://github.com/dotnet/maui/issues/8888

© www.soinside.com 2019 - 2024. All rights reserved.