У меня возникла проблема с изменением размера строк для Xamarin Forms, когда речь заходит о iOS. Мой код отлично работает на Android. Когда я изменяю размер строки для iOS, увеличивая размер, он будет перекрывать строку ниже. Googling дает мне следующие результаты: http://forums.xamarin.com/discussion/comment/67627/#Comment_67627
Результаты утверждают, что Xamarin Forms не реализовала это из-за проблем с производительностью. Я только нахожу результаты, которые старше 1 года, поэтому я не знаю, является ли это причиной.
Я нахожу несколько различных способов решить эту проблему в разных потоках, которые я обнаружил, но все они довольно сложны.
Для меня очень часто в приложениях элемент расширяется при выборе. Мне было интересно, может ли кто-нибудь здесь предложить решение, которое решит это? Если возможно, мне бы очень хотелось избежать повторного пересчета точных высот снова и снова. Должен ли я вводить пользовательский список с помощью Xamarin.iOS и инъекции зависимостей?
Я буду размещать свой XAML здесь, но XAML, вероятно, не проблема, так как он отлично работает на Android.
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="simpletest.PlayGroundPage">
<ContentPage.Content>
<StackLayout>
<ListView VerticalOptions="FillAndExpand" HasUnevenRows="True" SeparatorVisibility="None" ItemsSource="{Binding AllItems}" SelectedItem="{Binding MySelectedItem}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout VerticalOptions="FillAndExpand">
<Label Text="{Binding MyText}" />
<Button Text="button1" IsVisible="{Binding IsExtraControlsVisible}" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage.Content>
</ContentPage>
Мои пакеты для проекта forms:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="FreshEssentials" version="2.0.1" targetFramework="portable-net45+win+wp80+MonoTouch10+MonoAndroid10+xamarinmac20+xamarintvos10+xamarinwatchos10+xamarinios10" />
<package id="Xamarin.Forms" version="2.3.1.114" targetFramework="portable-net45+win+wp80+MonoTouch10+MonoAndroid10+xamarinmac20+xamarintvos10+xamarinwatchos10+xamarinios10" />
</packages>
Вот моя модель просмотра.
public class PlayGroundViewModel : INotifyPropertyChanged
{
private Item _mySelectedItem;
private ObservableCollection<Item> _allItems;
public PlayGroundViewModel(ObservableCollection<Item> allItems)
{
AllItems = allItems;
MySelectedItem = allItems.First();
ItemClicked = (obj) => { ExpandRow(obj); };
}
public ObservableCollection<Item> AllItems { get { return _allItems; } set { _allItems = value; SetChangedProperty("AllItems"); } }
public Action<Item> ItemClicked { get; private set; }
public Item MySelectedItem
{
get { return _mySelectedItem; }
set { _mySelectedItem = value; SetChangedProperty("MySelectedItem"); }
}
private void ExpandRow(Item item)
{
foreach (Item x in AllItems)
{
x.IsExtraControlsVisible = false;
}
if (item != null)
{
item.IsExtraControlsVisible = true;
}
SetChangedProperty("MySelectedItem");
SetChangedProperty("AllItems");
}
public event PropertyChangedEventHandler PropertyChanged;
private void SetChangedProperty(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
CodeBehind:
public PlayGroundPage()
{
InitializeComponent();
ObservableCollection<Item> items = new ObservableCollection<Item>();
items.Add(new Item("One"));
items.Add(new Item("Two"));
items.Add(new Item("Three"));
PlayGroundViewModel viewModel = new PlayGroundViewModel(items);
BindingContext = viewModel;
Action<Item> itemClickedAction = viewModel.ItemClicked;
ItemList.ItemTapped += (object sender, ItemTappedEventArgs e) =>
{
Item item = (Item)e.Item;
itemClickedAction.Invoke(item);
};
}
}
Пункт:
public class Item : INotifyPropertyChanged
{
public Item(string text)
{
_myText = text;
_isExtraControlsVisible = false;
}
private string _myText;
private bool _isExtraControlsVisible;
public event PropertyChangedEventHandler PropertyChanged;
public string MyText
{
get { return _myText; }
set { _myText = value; OnPropertyChanged("MyText"); }
}
public bool IsExtraControlsVisible
{
get { return _isExtraControlsVisible; }
set { _isExtraControlsVisible = value; OnPropertyChanged("IsExtraControlsVisible"); }
}
private void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
Я опубликую два изображения ниже списка. Первое изображение без щелчка. Вторая картинка после нажатия "Два". В ячейке появляется кнопка, но ячейка перекрывает ячейку ниже ( "Три" ).