【问题标题】:Xamarin forms: Layout visibility show/hide not working in iOS but working in AndroidXamarin 表单:布局可见性显示/隐藏在 iOS 中不起作用,但在 Android 中起作用
【发布时间】:2017-10-12 14:49:44
【问题描述】:

我有一个包含两个堆栈布局的列表。单击需要显示/隐藏第二个堆栈的第一个堆栈。这在 android 中运行良好,但在 iOS 中无法运行。当 IsVisible 为真时,布局不会扩展。

  <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 中得到的内容

以下是 android 中的期望。

【问题讨论】:

  • 请输入您的代码,因为使用 IsVisible 它在​​ ios 和 android 中都可以正常工作,我认为代码中存在一些问题。
  • @Pratik 已更新代码

标签: xamarin xamarin.ios xamarin.forms


【解决方案1】:

我在 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了解更多详情。

【讨论】:

  • 感谢您的回复,由于 IOS 中的此问题,我仅在 android 中调用它。作为一种解决方法,我将所有单元格设置为在 iOS 中可见。该解决方案似乎对我不起作用。
【解决方案2】:

更新您的后端代码删除 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>

【讨论】:

  • Device.RuntimePlatform==Device.Android 被添加只是因为它在 iOS 中引起了问题。您的解决方案不起作用
  • 查看我的更新答案。您应该根据列表中的 id 删除旧项目并添加新的更新项目。
猜你喜欢
  • 2014-02-15
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多