Подтвердить что ты не робот

Автоматически изменять размер строки списка для iOS в форматах Xamarin

У меня возникла проблема с изменением размера строк для 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));
        }
    }
}

Я опубликую два изображения ниже списка. Первое изображение без щелчка. Вторая картинка после нажатия "Два". В ячейке появляется кнопка, но ячейка перекрывает ячейку ниже ( "Три" ).

Unclicked

Clicked

4b9b3361

Ответ 1

Я не уверен, почему у SushiHangover нет такой же проблемы, но я получаю то же самое, что и вы. По умолчанию мой размер не изменяется.

Независимо от того, хотите ли вы использовать его предложение об обновлении элемента или использовать способ, которым вы это сделали, это должно заставить ваши ячейки обновляться до нужного размера.

Измените свой ViewCell, чтобы обработать нажатие.

<ViewCell Tapped="Handle_Tapped">

затем в коде для вашей страницы xaml

void Handle_Tapped(object sender, System.EventArgs e)
{
    (sender as ViewCell).ForceUpdateSize();
}

документация для ForceUpdateSize() говорит, что будьте осторожны с ним, потому что это может быть дорого, но если это, безусловно, будет наименее количество усилий, чтобы заставить его делать то, что вы ищете.