我使用Xamarin Forms創建通用應用程序。Xamarin Forms中Grid中ListView中可見的項目
該代碼只在Universal項目上,我創建的圖形通過代碼添加組件並將它們傳遞給ContentPage。
該頁面包含一個具有屏幕大小的網格。在網格中有兩個ListView,每個都使用垂直屏幕的一半。
要檢索可見項目,我使用了兩個事件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);
}
}
}
謝謝你的評論。我已經添加了一些代碼,我的應用程序將允許閱讀2種語言的內容,這不是重要的圖形,但內容。我想同步兩個ListView之間的滾動和選擇。出於這個原因,我需要知道頂部項目和可見的。 – Eclipses
沒有試圖自己做,但我最近需要與calander控件同步日期列表。我們結束了使用CarouselView。我認爲你可以用2個carosel視圖來實現這一點,並可能對佈局有更好的控制 – David