2016-12-30 67 views
0

我使用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); 
    } 
} 

}

回答

0

它的家常便飯,我們親切地稱之爲Android系統。不同版本的Android手柄控制方式不同。事情佈局不同。即使您發現某個解決方案看起來完全像您在特定設備上的某個分辨率上所需的,我幾乎可以保證它不會在下一個設備上看起來如此。

很難給出一個好的建議,如何「修復」這個沒有屏幕截圖或代碼。但大多數情況下,垂直佈局我會說,把它們放在一個堆棧,讓他們有他們想要的一樣多或一樣小的空間。小設備將滾動大設備將在底部有一個巨大的空白塊。

+0

謝謝你的評論。我已經添加了一些代碼,我的應用程序將允許閱讀2種語言的內容,這不是重要的圖形,但內容。我想同步兩個ListView之間的滾動和選擇。出於這個原因,我需要知道頂部項目和可見的。 – Eclipses

+0

沒有試圖自己做,但我最近需要與calander控件同步日期列表。我們結束了使用CarouselView。我認爲你可以用2個carosel視圖來實現這一點,並可能對佈局有更好的控制 – David

相關問題