Xamarin格式:布局可见性显示/隐藏不在iOS中工作,但在Android中工作

问题描述:

我有一个包含两个堆栈布局的列表。点击需要显示/隐藏第二个堆栈的第一个堆栈。这在android中完美工作,但不适用于iOS。 IsVisible为true时布局不扩展。Xamarin格式:布局可见性显示/隐藏不在iOS中工作,但在Android中工作

<ListView ItemsSource="{Binding PackageList}" 
           ItemSelected="Package_ItemSelected" 
           IsPullToRefreshEnabled="true" 
           HasUnevenRows="True" 
           SeparatorVisibility="None"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <ViewCell> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="60"/> 
         <RowDefinition Height="Auto"/> 
        </Grid.RowDefinitions> 
        <StackLayout Grid.Row="0" Padding="10" Orientation="Horizontal" Spacing="10" BackgroundColor="#f2f2f2"> 
         <Image Source="{Binding Item.PackageType}" VerticalOptions="CenterAndExpand"/> 
         <StackLayout Spacing="5" VerticalOptions="Center"> 
          <Label Text="{Binding Item.PackageName}" Style="{DynamicResource LabelStyle}" YAlign="Center"/> 
          <Label Text="(can accept/decline request only)" IsVisible="{Binding Item.PackageType}" Style="{DynamicResource LabelGraySmall}" LineBreakMode="WordWrap" YAlign="Center"/> 
         </StackLayout> 
         <Grid HorizontalOptions="EndAndExpand" > 
          <Image Source="up.png" Style="{DynamicResource ArrowStyle}" IsVisible="{Binding IsVisible}" VerticalOptions="CenterAndExpand"/> 
          <Image Source="downsmall.png" Style="{DynamicResource ArrowStyle}" IsVisible="{Binding IsNotVisible}" VerticalOptions="CenterAndExpand"/> 
         </Grid> 
        </StackLayout> 
        <StackLayout Grid.Row="1" Padding="15" Spacing="10" IsVisible="{Binding IsVisible}"> 
         <StackLayout.GestureRecognizers> 
          <TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped"/> 
         </StackLayout.GestureRecognizers> 
         <Label Text="{Binding Item.Description}" Style="{DynamicResource LabelStyle}" YAlign="Center" HorizontalTextAlignment="Center" HorizontalOptions="CenterAndExpand"/> 
         <Button Text="Choose Package" Command="{Binding Path=BindingContext.PackageCommand,Source={x:Reference packagePage}}" CommandParameter="{Binding Item}" Style="{DynamicResource ButtonBlue}" WidthRequest="200" HeightRequest="40" HorizontalOptions="CenterAndExpand" /> 
        </StackLayout> 
       </Grid> 
      </ViewCell> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

后端代码

private void Package_ItemSelected(object sender, SelectedItemChangedEventArgs e) 
    { 

      if (e.SelectedItem == null) return; 
      if (e.SelectedItem != null) 
      { 
       var tappedItem = (PackageWrapper<PackageResult>)e.SelectedItem; 
       tappedItem.IsNotVisible = !tappedItem.IsNotVisible; 
       tappedItem.IsVisible = !tappedItem.IsNotVisible; 
      } 
     ((ListView)sender).SelectedItem = null; 
    } 

包装类:

public class PackageWrapper<T> : INotifyPropertyChanged 
{ 
    public T Item { get; set; } 
    bool isVisible = false; 
    public bool IsVisible 
    { 
     get 
     { 
      return isVisible; 
     } 
     set 
     { 
      if (isVisible != value) 
      { 
       isVisible = value; 
       PropertyChanged(this, new PropertyChangedEventArgs("IsVisible")); 
      } 
     } 
    } 
    bool isNotVisible = true; 
    public bool IsNotVisible 
    { 
     get 
     { 
      return isNotVisible; 
     } 
     set 
     { 
      if (isNotVisible != value) 
      { 
       isNotVisible = value; 
       PropertyChanged(this, new PropertyChangedEventArgs("IsNotVisible")); 
      } 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
} 

请询问细节截图

下面是我在的iOS

01我得到

Below is what i am getting in iOS

以下是android中的期望。 enter image description here

+0

请把你的代码,因为使用ISVISIBLE它在ios和android都能正常工作,我认为代码中存在一些问题。 – Pratik

+0

@Pratik更新了代码 – Renjith

我在iOS上遇到了同样的问题。

您需要调用Cell.ForceUpdateSize才能让iOS调整单元格的大小。

你应该可以在你的代码中做到这一点。例如:

var tappedItem = (PackageWrapper<PackageResult>)e.SelectedItem; 
tappedItem.IsNotVisible = !tappedItem.IsNotVisible; 
tappedItem.IsVisible = !tappedItem.IsNotVisible; 

var viewCell = tappedItem.Parent.Parent as ViewCell; 
viewCell.ForceUpdateSize(); 

我注意到,如果操作系统是Android,您只能调用该代码。有什么理由呢?

请注意,这在处理方面很昂贵,并且可能会减慢速度。

Have a look at this example了解更多详情。

+0

感谢您的回应,我只是在Android中由于IOS中的这个问题才调用它。作为一种解决方法,我将所有单元格设置为在iOS中可见。该解决方案似乎不适合我。 – Renjith

更新您的后端代码删除Device.RuntimePlatform == Device.Android条件

 private void Package_ItemSelected(object sender, SelectedItemChangedEventArgs e) 
     { 

       if (e.SelectedItem == null) return; 
       if (e.SelectedItem != null) 
       { 
        var tappedItem = (PackageWrapper<PackageResult>)e.SelectedItem; 
        // ViewModel.PackageList.remove(tappedItem); 
tappedItem.IsNotVisible = !tappedItem.IsNotVisible; 
        tappedItem.IsVisible = !tappedItem.IsNotVisible; 
        //ViewModel.PackageList.Add(tappedItem); 
       } 
      ((ListView)sender).SelectedItem = null; 

     } 

并把您的堆栈视图内容视图象下面这样:

<ContentView VerticalOptions="FillAndExpand" Grid.Row="1" IsVisible="{Binding IsVisible}"> 
         <StackLayout Padding="15" Spacing="10" > 
          <StackLayout.GestureRecognizers> 
           <TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped"/> 
          </StackLayout.GestureRecognizers> 
          <Label Text="{Binding Item.Description}" Style="{DynamicResource LabelStyle}" YAlign="Center" HorizontalTextAlignment="Center" HorizontalOptions="CenterAndExpand"/> 
          <Button Text="Choose Package" Command="{Binding Path=BindingContext.PackageCommand,Source={x:Reference packagePage}}" CommandParameter="{Binding Item}" Style="{DynamicResource ButtonBlue}" WidthRequest="200" HeightRequest="40" HorizontalOptions="CenterAndExpand" /> 
         </StackLayout> 
</ContentView> 
+0

Device.RuntimePlatform ==仅添加了Device.Android是因为它在iOS中引发了问题。您的解决方案不起作用 – Renjith

+0

查看我的更新回答。您应该根据列表中的ID移除旧项目并添加新的更新项目。 –