【问题标题】:How to set auto height of collection view in xamarin forms?如何在 xamarin 表单中设置集合视图的自动高度?
【发布时间】:2021-07-19 12:07:17
【问题描述】:

我在一个页面中有多个集合视图,所以目前我正在动态计算高度,它不能按预期正常工作,因为内容也是动态的。

那么集合视图将采用自动高度的任何解决方案?

【问题讨论】:

    标签: xamarin xamarin.forms


    【解决方案1】:

    我认为您的页面如下所示:

    <?xml version="1.0" encoding="utf-8" ?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="XamarinWork.MainPage">
    
        <ScrollView>
            <StackLayout>
                <CollectionView x:Name="Collection"
                         Margin="0,30,0,0"
                         HorizontalOptions="Start"
                         VerticalOptions="Start">
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <Label Text="{Binding .}"
                                LineBreakMode="WordWrap"
                                HorizontalOptions="StartAndExpand"
                                VerticalOptions="FillAndExpand"/>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>
                <CollectionView x:Name="Collection2"
                         HorizontalOptions="Start"
                         VerticalOptions="Start">
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <Label Text="{Binding .}"
                                LineBreakMode="WordWrap"
                                HorizontalOptions="StartAndExpand"
                                VerticalOptions="FillAndExpand"/>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>
            </StackLayout>
        </ScrollView>
    </ContentPage>

    您可以创建一个行为来计算每个项目的高度以增加 ContentView 的高度,如下所示:

    public class CollectionFitContentBehavior : Behavior<CollectionView>
    {
        List<View> _itemsView;
        CollectionView _control;
        protected override void OnAttachedTo(CollectionView bindable)
        {
            base.OnAttachedTo(bindable);
            _control = bindable;
            _control.ChildAdded += ChildsAdded;
            _itemsView = new List<View>();
        }
    
        protected override void OnDetachingFrom(CollectionView bindable)
        {
            base.OnDetachingFrom(bindable);
            _control.ChildAdded -= ChildsAdded;
    
            foreach(var item in _itemsView)
                item.SizeChanged -= ChildSize;
        }
    
        private void ChildsAdded(object sender, ElementEventArgs e)
        {
            var cell = (e.Element as View);
            cell.SizeChanged += ChildSize;
            _itemsView.Add(cell);
        }
    
        private void ChildSize(object sender, EventArgs e)
        {
            var cell = (sender as View);
            _control.HeightRequest = _control.HeightRequest + cell.Height;
        }
    }
    

    并添加如下行为:

    <?xml version="1.0" encoding="utf-8" ?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:xamarinwork="clr-namespace:XamarinWork"
                 x:Class="XamarinWork.MainPage">
    
        <ScrollView>
            <StackLayout>
                <CollectionView x:Name="Collection"
                         Margin="0,30,0,0"
                         HorizontalOptions="Start"
                         VerticalOptions="Start">
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <Label Text="{Binding .}"
                                LineBreakMode="WordWrap"
                                HorizontalOptions="StartAndExpand"
                                VerticalOptions="FillAndExpand"/>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                    <CollectionView.Behaviors>
                        <xamarinwork:CollectionFitContentBehavior/>
                    </CollectionView.Behaviors>
                </CollectionView>
                <CollectionView x:Name="Collection2"
                         HorizontalOptions="Start"
                         VerticalOptions="Start">
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <Label Text="{Binding .}"
                                LineBreakMode="WordWrap"
                                HorizontalOptions="StartAndExpand"
                                VerticalOptions="FillAndExpand"/>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                    <CollectionView.Behaviors>
                        <xamarinwork:CollectionFitContentBehavior/>
                    </CollectionView.Behaviors>
                </CollectionView>
            </StackLayout>
        </ScrollView>
    </ContentPage>

    【讨论】:

    • 这段代码对我有用。你可以发布你的页面吗?有滚动视图吗?
    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2014-04-27
    相关资源
    最近更新 更多