Элементы, видимые в представлении списка внутри сетки в формах Xamarin

Я создаю Универсальное приложение с помощью форм Xamarin.

Код находится только в универсальном проекте, и я создаю графику, добавляя компоненты с помощью кода и передавая их на страницу содержимого.

Страница содержит сетку с размером экрана. Внутри сетки есть два списка, каждый из которых использует вертикальную половину экрана.

Для извлечения видимых элементов я использую два события ItemAppearing и ItemDisappearing. Мне нужно знать не только видимые элементы, но и верхние.

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

Является ли различное поведение ошибкой в Xamarin? Есть ли другие способы получить элементы, видимые и верхний?

Мне нужно что-то, что работает для всех видов устройств, а не частичное решение.

public class Verses : ContentPage
{
    ListView listView, listView1;
    List<VERS> versesENG, versesOTH;

    public List<int> visible = new List<int>();

    public Verses(CHAPTER chapterENG, CHAPTER chapterOTH)
    {
        versesENG = chapterENG.VERS.ToList();
        versesOTH = chapterOTH.VERS.ToList();

        listView = new ListView();
        listView.ItemsSource = versesENG;
        listView.ItemTemplate = new DataTemplate(typeof(CustomCell));
        listView.HasUnevenRows = true;
        listView.RowHeight = -1;
        listView.ItemTapped += ListView_ItemTapped;
        listView.ItemAppearing += ListView_ItemAppearing;
        listView.ItemDisappearing += ListView_ItemDisappearing;

        listView1 = new ListView();
        listView1.ItemsSource = versesOTH;
        listView1.ItemTemplate = new DataTemplate(typeof(CustomCell));
        listView1.HasUnevenRows = true;
        listView1.RowHeight = -1;
        listView1.ItemTapped += ListView1_ItemTapped;

        Grid grid = new Grid();
        grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
        grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1) });
        grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
        grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
        grid.Children.Add(listView, 0, 0);
        grid.Children.Add(new BoxView() { HeightRequest = 1, BackgroundColor = Color.Accent }, 0, 1);
        grid.Children.Add(listView1, 0, 2);

        Content = grid;
    }

    private void ListView_ItemTapped(object sender, ItemTappedEventArgs e)
    {
        VERS v = (VERS)e.Item;
        listView1.ScrollTo(listView1.ItemsSource.OfType<object>().ElementAt(v.vnumber - 1), ScrollToPosition.MakeVisible, true);
        listView1.SelectedItem = listView1.ItemsSource.OfType<object>().ElementAt(v.vnumber - 1);
    }

    private void ListView_ItemAppearing(object sender, ItemVisibilityEventArgs e)
    {
        VERS v = (VERS)e.Item;

        visible.Add(v.vnumber);
        visible.Sort();

        var top = visible.First();

        this.Title = "L";
        visible.Count();
        foreach (int i in visible)
        {
          this.Title += " " + i.ToString();
        }
      }
    }

    private void ListView_ItemDisappearing(object sender, ItemVisibilityEventArgs e)
    {
        VERS v = (VERS)e.Item;
        visible.Remove(v.vnumber);
    }
}

}

1 ответ

  1. Его потлак мы с любовью называем Android. Различные версии Android ручки управления по-разному. Вещи раскладываются по-разному. Даже если вы найдете решение, которое выглядит точно так же, как вы хотите его тоже на определенном разрешении на определенном устройстве, я почти гарантирую, что оно не будет выглядеть так на следующем устройстве.

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