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我得到
我在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了解更多详情。
感谢您的回应,我只是在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>
Device.RuntimePlatform ==仅添加了Device.Android是因为它在iOS中引发了问题。您的解决方案不起作用 – Renjith
查看我的更新回答。您应该根据列表中的ID移除旧项目并添加新的更新项目。 –
请把你的代码,因为使用ISVISIBLE它在ios和android都能正常工作,我认为代码中存在一些问题。 – Pratik
@Pratik更新了代码 – Renjith