隐藏

Xamarin.Forms-将CollectionView的高度调整为适合子对象的最小大小

发布:2021/10/22 22:33:27作者:管理员 来源:本站 浏览次数:1074



我有一个CollectionView,里面有一些项目。我正在尝试调整CollectionView的大小,使其足以容纳所有的子对象。现在,它比它有孩子的数量要大得多。

蓝色表示CollectionView的大小。正如你所见,它的大小远远超过了它的孩子。我希望它能完全适合他们,或者至少能更接近同样的尺寸。

我对页面上的任何元素(包括CollectionView)都没有任何高度要求。

这是我的密码。目前还不是特别漂亮,但这是一项正在进行的工作。

<StackLayout>
                <CollectionView x:Name="assessmentsCollectionView"
                                BackgroundColor="Blue">
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <StackLayout Spacing="10"
                                         Padding="5">
                                <Frame CornerRadius="5"
                                       Padding="0"
                                       HorizontalOptions="FillAndExpand"
                                       VerticalOptions="FillAndExpand">
                                    <StackLayout Orientation="Horizontal">
                                        <Frame Padding="5"
                                               CornerRadius="0"
                                               WidthRequest="50">
                                            <Label Text="{Binding TypeLetter}"
                                                   TextColor="#37474f"
                                                   FontSize="24"
                                                   VerticalTextAlignment="Center"
                                                   HorizontalTextAlignment="Center"/>
                                        </Frame>
                                        <StackLayout Padding="10">
                                            <Label Text="{Binding Name}"
                                               TextColor="Black"
                                               FontSize="24"/>
                                            <StackLayout Orientation="Horizontal">
                                                <Image Source="calendarIcon.png"
                                                       WidthRequest="12"
                                                       HeightRequest="12"/>
                                                <Label Text="{Binding Date}"
                                                       FontSize="12"
                                                       TextColor="Gray"/>
                                            </StackLayout>
                                        </StackLayout>
                                    </StackLayout>
                                </Frame>
                            </StackLayout>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>
            </StackLayout>


解答

如果Collectionview中的行很少,可以将值设置为collectionView.height请求. 当物品增加时,高度也会增加。


我创建了一个属性称为RowHeigth. 如果在CollectionView中添加项(使用AddCommand),RowHeigth将增加。


<StackLayout>

       <CollectionView

           x:Name="assessmentsCollectionView"

           BackgroundColor="Blue"

           HeightRequest="{Binding rowHeigth}"

           ItemsSource="{Binding letters}">

           <CollectionView.ItemTemplate>

               <DataTemplate>

                   <StackLayout Padding="5" Spacing="10">

                       <Frame

                           Padding="0"

                           CornerRadius="5"

                           HorizontalOptions="FillAndExpand"

                           VerticalOptions="FillAndExpand">

                           <StackLayout Orientation="Horizontal">

                               <Frame

                                   Padding="5"

                                   CornerRadius="0"

                                   WidthRequest="50">

                                   <Label

                                       FontSize="24"

                                       HorizontalTextAlignment="Center"

                                       Text="{Binding TypeLetter}"

                                       TextColor="#37474f"

                                       VerticalTextAlignment="Center" />

                               </Frame>

                               <StackLayout Padding="10">

                                   <Label

                                       FontSize="24"

                                       Text="{Binding Name}"

                                       TextColor="Black" />

                                   <StackLayout Orientation="Horizontal">

                                       <Image

                                           HeightRequest="12"

                                           Source="c1.png"

                                           WidthRequest="12" />

                                       <Label

                                           FontSize="12"

                                           Text="{Binding Date}"

                                           TextColor="Gray" />

                                   </StackLayout>

                               </StackLayout>

                           </StackLayout>

                       </Frame>

                   </StackLayout>

               </DataTemplate>

           </CollectionView.ItemTemplate>

       </CollectionView>

       <Button

           x:Name="btn1"

           Command="{Binding AddCommand}"

           Text="btn1" />

   </StackLayout>


public partial class Page4 : ContentPage

{

   

   public Page4()

   {

       InitializeComponent();


       this.BindingContext = new letterviewmodel(); ;

   }

}

public class letterviewmodel: INotifyPropertyChanged

{

   public ObservableCollection<lettermodel> letters { get; set; }

   private int _rowHeigth;

   public int rowHeigth

   {

       get { return _rowHeigth; }

       set

       {

           _rowHeigth = value;

           RaisePropertyChanged("rowHeigth");

       }

   }

   public ICommand AddCommand { protected set; get; }

   public letterviewmodel()

   {

       letters = new ObservableCollection<lettermodel>()

       {

           new lettermodel(){TypeLetter="A",Name="letter 1",Date="2021-01-01"},

           new lettermodel(){TypeLetter="B",Name="letter 2",Date="2021-01-01"},

           new lettermodel(){TypeLetter="C",Name="letter 3",Date="2021-01-01"}


       };

       rowHeigth = letters.Count * 100 ;


       AddCommand = new Command<lettermodel>(async (key) => {

           letters.Add(new lettermodel() { TypeLetter = "D", Name = "test letter ", Date = "2021-01-01" });

           rowHeigth = letters.Count * 100 ;

       });

   }

   

   public event PropertyChangedEventHandler PropertyChanged;      

   public void RaisePropertyChanged(string propertyName)

   {

       PropertyChangedEventHandler handler = PropertyChanged;

       if (handler != null)

       {

           handler(this, new PropertyChangedEventArgs(propertyName));

       }

   }

}

public class lettermodel

{

   public string TypeLetter { get; set; }

   public string Name { get; set; }

   public string Date { get; set; }

}


别忘了实现INotifyPropertyChanged接口,实现inotify数据更新。