Xamarin在ListView中使用StackLayout可见性形成跨平台问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xamarin在ListView中使用StackLayout可见性形成跨平台问题相关的知识,希望对你有一定的参考价值。

我有一个带有ListView的Xamarin Forms Cross Platform项目,其ViewCell包含一个StackLayout。当用户点击图像时,我隐藏并显示StackLayout。有一个已知的问题,ViewCell没有在ios上正确调整大小,我发现解决方案是在ViewCell上使用ForceUpdateSize方法,以便iOS上的应用程序调整单元格的大小。这是在调整ViewCell大小的方面起作用 - 但是在调用方法之后,我松开了ViewCell底部的三个按钮。按钮位于网格中,所有代码,xaml和屏幕截图都在下面。任何帮助解决这个问题将不胜感激。

Image of problem

页面XAML:

                        <ViewCell x:Name="vcDetails" >
                        <StackLayout Orientation="Vertical" HorizontalOptions="Fill" VerticalOptions="Start">
                            <BoxView x:Name="bvLine" VerticalOptions="Center" BackgroundColor="Black" 
                                                                 HorizontalOptions="FillAndExpand" HeightRequest="4" />
                            <StackLayout Orientation="Vertical" HorizontalOptions="Fill" VerticalOptions="Start">
                                <!-- Info Button and title-->
                                <StackLayout x:Name="slPlaceName" HorizontalOptions="Fill" VerticalOptions="Start" Orientation="Horizontal" Margin="0,0,0,0">
                                    <Image x:Name="btnDropDown" HorizontalOptions="Start" VerticalOptions="Center" Source="circledropdown.png" Margin="0,4,4,0" IsVisible="{Binding ShowDropDown}"/>
                                    <Image x:Name="btnDropUp" HorizontalOptions="Start" VerticalOptions="Center" Source="circledropup.png" Margin="0,4,4,0" IsVisible="{Binding ShowDropUp}"/>
                                    <Label x:Name="lblPlaceName" TextColor="Gray" FontAttributes="Bold" Text="{Binding Title}" FontSize="Medium" Margin="0,0,0,0" VerticalOptions="Center" 
                                                                       HorizontalOptions="FillAndExpand" />
                                    <StackLayout.GestureRecognizers>
                                        <TapGestureRecognizer Tapped="btnDetails_Clicked" CommandParameter="{Binding ID}"/>
                                    </StackLayout.GestureRecognizers>
                                </StackLayout>
                                <StackLayout x:Name="slDetails" Orientation="Vertical" HorizontalOptions="Fill" VerticalOptions="StartAndExpand" Margin="8,4,8,4"
                                                                         IsVisible="{Binding ShowDetails}" BackgroundColor="LightGray">
                                    <BoxView VerticalOptions="Start" HorizontalOptions="Fill" BackgroundColor="DarkCyan" HeightRequest="2" Margin="0,0,0,0" />
                                    <Label x:Name="lblStreetAddress" VerticalOptions="Start" HorizontalOptions="Start" HorizontalTextAlignment="Start"  
                                                                           TextColor="Black" FontSize="Small" Text="{Binding AddressLine1}" />
                                    <Label x:Name="lblCityStateZip" VerticalOptions="Start" HorizontalOptions="Start" HorizontalTextAlignment="Start" TextColor="Black" FontSize="Small" 
                                                                           Text="{Binding CityStateZip}" />
                                    <Label x:Name="lblHours" VerticalOptions="Start" HorizontalOptions="Start" TextColor="Black" FontSize="Small" Text="{Binding Hours}" HorizontalTextAlignment="Center" />

                                    <Grid x:Name="gvDetailButtons" VerticalOptions="CenterAndExpand" HorizontalOptions="FillAndExpand" Margin="8,4,8,4">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="*" />
                                            <ColumnDefinition Width="*" />
                                        </Grid.ColumnDefinitions>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="auto" />
                                            <RowDefinition Height="auto" />
                                        </Grid.RowDefinitions>
                                        <StackLayout x:Name="btnGoToInfoPage" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Orientation="Vertical" Margin="8,0,4,0"
                                                                                 Grid.Column="0" Grid.Row="0" BackgroundColor="DarkGray" Padding="0,2,0,2">
                                            <StackLayout HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" Orientation="Horizontal">
                                                <Image x:Name="btnInfo" HorizontalOptions="Start" VerticalOptions="CenterAndExpand" Source="infosmall.png" Margin="0,0,4,0" />
                                                <Label x:Name="lblbntInfo" Text="{ext:Translate MoreInfo}" TextColor="Black" FontAttributes="Bold"
                                                                                   HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" FontSize="Small"/>
                                            </StackLayout>
                                            <StackLayout.GestureRecognizers>
                                                <TapGestureRecognizer Tapped="btnGoToInfoPage" CommandParameter="{Binding ID}"/>
                                            </StackLayout.GestureRecognizers>
                                        </StackLayout>

                                        <StackLayout x:Name="slGoToEditPage" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Orientation="Vertical" Margin="4,0,8,0"
                                                                                 Grid.Column="1" Grid.Row="0" BackgroundColor="DarkGray" Padding="0,2,0,2">
                                            <StackLayout HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" Orientation="Horizontal">
                                                <Image x:Name="btnedit" Source="editsmall.png" Margin="8,0,0,0" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"/>
                                                <Label x:Name="lblbntEdit" Text="{ext:Translate Edit}" TextColor="Black" FontAttributes="Bold" 
                                                                                   HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" FontSize="Small"/>
                                            </StackLayout>
                                            <StackLayout.GestureRecognizers>
                                                <TapGestureRecognizer Tapped="btnedit_Tapped" CommandParameter="{Binding ID}"/>
                                            </StackLayout.GestureRecognizers>
                                        </StackLayout>
                                    </Grid>
                                    <BoxView VerticalOptions="Start" HorizontalOptions="Fill" BackgroundColor="DarkCyan" HeightRequest="2" Margin="0,0,0,0" 
                                                                             Grid.ColumnSpan="2" Grid.Column="0" Grid.Row="1"/>
                                </StackLayout>
                                <StackLayout x:Name="slRatingandDistance" Orientation="Horizontal" VerticalOptions="Center" HorizontalOptions="StartAndExpand">
                                    <Label x:Name="lblRatingHeader" Text="{ext:Translate RatingText}" TextColor="Black" FontSize="Small" FontAttributes="Bold"
                                                                   Margin="4,0,0,0" HorizontalOptions="Start" VerticalOptions="Center"/>
                                    <Label x:Name="lblRatingValue" Text="{Binding Rating}"  TextColor="Black" FontSize="Small"
                                                                   HorizontalOptions="Start" VerticalOptions="Center"/>
                                    <Label x:Name="lblDistanceHeader" Text="{ext:Translate DistanceText}"  TextColor="Black" FontSize="Small" FontAttributes="Bold"
                                                                   Margin="4,0,0,0" HorizontalOptions="Start" VerticalOptions="Center"/>
                                    <Label x:Name="lblDistanceValue" Text="{Binding Distance}" TextColor="Black" FontSize="Small"
                                                                   HorizontalOptions="Start" VerticalOptions="Center" />
                                </StackLayout>
                                <Label x:Name="lblAttributes" Text="{Binding AttributesTexts}" 
                                                                       TextColor="Black" FontSize="Small" LineBreakMode="WordWrap" Margin="0,0,0,0" HorizontalOptions="Start" 
                                                                       VerticalOptions="Start"/>
                            </StackLayout>
                            <Grid x:Name="gvButtons" VerticalOptions="CenterAndExpand" HorizontalOptions="FillAndExpand" Margin="4,4,4,4">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*" />
                                    <ColumnDefinition Width="*" />
                                    <ColumnDefinition Width="*" />
                                </Grid.ColumnDefinitions>

                                <StackLayout x:Name="btnRate" Orientation="Horizontal" HorizontalOptions="FillAndExpand" VerticalOptions="CenterAndExpand" BackgroundColor="DarkGray" 
                                                                         Margin="2,0,2,0" Grid.Column="0" Padding="0,2,0,2">
                                    <StackLayout x:Name="slLayoutRate" Orientation="Horizontal" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" >
                                        <Image x:Name="imgRate" Source="smallstar.png" HorizontalOptions="Center" VerticalOptions="Center" Margin="0,0,4,0" />
                                        <Label x:Name="lblRate" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" Text="{ext:Translate Rate}" 
                                                                    TextColor="Black" FontAttributes="Bold" FontSize="Small" Margin="0,0,0,0" />
                                    </StackLayout>
                                    <StackLayout.GestureRecognizers>
                                        <TapGestureRecognizer Tapped="btnRate_Clicked"  CommandParameter="{Binding ID}"/>
                                    </StackLayout.GestureRecognizers>
                                </StackLayout>

                                <StackLayout x:Name="btnMap" Orientation="Horizontal" HorizontalOptions="FillAndExpand" VerticalOptions="CenterAndExpand" BackgroundColor="DarkGray" 
                                                                         Margin="2,0,2,0" Grid.Column="1" Padding="0,2,0,2">
                                    <StackLayout x:Name="slLayoutMap" Orientation="Horizontal" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" >
                                        <Image x:Name="imgMap" Source="mapblue.png" HorizontalOptions="Center" VerticalOptions="Center" Margin="0,0,4,0" />
                                        <Label x:Name="lblMap" HorizontalOptions="Center" VerticalOptions="Center" Text="{ext:Translate Map}" 
                                                                    TextColor="Black" FontAttributes="Bold" FontSize="Small" Margin="0,0,0,0" />
                                    </StackLayout>
                                    <StackLayout.GestureRecognizers>
                                        <TapGestureRecognizer Tapped="btnMap_Clicked" CommandParameter="{Binding ID}"/>
                                    </StackLayout.GestureRecognizers>
                                </StackLayout>

                                <StackLayout x:Name="btnClosed" Orientation="Horizontal" HorizontalOptions="FillAndExpand" VerticalOptions="CenterAndExpand" BackgroundColor="DarkGray" 
                                                                         Margin="2,0,2,0" Grid.Column="2" Padding="0,2,0,2">
                                    <StackLayout x:Name="slLayoutClosed" Orientation="Horizontal" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" >
                                        <Image x:Name="imgClosed" Source="closed.png" HorizontalOptions="CenterAndExpand" VerticalOptions="Center" Margin="0,0,4,0" />
                                        <Label x:Name="lblClosed" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" Text="{ext:Translate Closed}" 
                                                                    TextColor="Black" FontAttributes="Bold" FontSize="Small" Margin="0,0,0,0" />
                                    </StackLayout>
                                    <StackLayout.GestureRecognizers>
                                        <TapGestureRecognizer Tapped="btnClosed_Clicked" CommandParameter="{Binding ID}"/>
                                    </StackLayout.GestureRecognizers>
                                </StackLayout>
                            </Grid>
                        </StackLayout>
                    </ViewCell>

对隐藏进行编码/显示堆栈布局。

private void btnDetails_Clicked(object sender, EventArgs e)
{
    long ll_PlaceID = -1;
    try
    {
        ll_PlaceID = Convert.ToInt64(((TappedEventArgs)e).Parameter);
        ViewModelObjects.NearbyPlaces.ShowDetailText(ll_PlaceID);

        if (Device.RuntimePlatform == Device.iOS)
        {
            ((ViewCell)((Element)sender).Parent.Parent.Parent).ForceUpdateSize();
        }
    }
    catch (Exception ex)
    {
        App.ProcessException(ex);
    }

}

从视图模型中显示详细信息代码

public void ShowDetailText(long pl_PlaceID)
{
    GBSPlaceDetail lobj_Place = null;
    try
    {
        lobj_Place = (GBSPlaceDetail)(from lobj_Work in GBSPlaceDetails
                                      where lobj_Work.ID == pl_PlaceID
                                      select lobj_Work).ToList()[0];

        if (lobj_Place != null)
            lobj_Place.ShowDetails = !lobj_Place.ShowDetails;
    }
    catch (Exception ex)
    {
        App.ProcessException(ex);
    }
}

任何建议将不胜感激。

答案

没有人真的回应我的帖子所以我开始寻找其他控件使用。我发现SyncFusion也有一个ListView控件。对于Xamarin Forms ListView控件来说,这似乎是一个非常简单的过程(添加所需的命名空间并使用SyncFusion ListView命名空间为所有控件添加前缀)。在iOS上,当扩展列表项条目的大小时,仍然需要调用额外的代码,但SyncFusion代码似乎比Xamarin代码更清晰,因为在使用SyncFusion ListViewcontrol时问题没有显现。

这是我必须在我的PCL项目中的页面代码中包含的代码。 (lvPlaces是我在XAML中的ListView控件的名称)

if (Device.RuntimePlatform == Device.iOS)
{
    lvPlaces.ForceUpdateItemSize();

}

以上是关于Xamarin在ListView中使用StackLayout可见性形成跨平台问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ListViewRenderer 在 Xamarin UWP 中使用 ListView 的 GroupHeader 模板

Xamarin表单 - 如何使用标题生成iOS ListView本机分组样式?

使用 LinearLayout 向 ListView 添加标题,Listview 被推离屏幕(Xamarin Android)

Xamarin在ListView中使用StackLayout可见性形成跨平台问题

Xamarin Forms - 在一个 ListView 中绑定多个 TextCell

Xamarin 使用 DataTemplateSelector 不在 ListView