まず、ItemAppearingプロパティは、探している動作ではありません。 XamarinフォームのListViewのItemAppearingイベントは、リストアイテムがレンダリングされるときに発生します。小さなリストの場合、このイベントはすべてのアイテムに対して直ちに起動されます。 UWPの同等のイベントはListView.ChoosingItemContainerイベントであり、ItemAppearingイベントと同様にListViewが仮想化されていない限り、リスト内のすべてのアイテムに対して発生します。大規模な仮想化されたリストであっても、それは数ページの項目に対して発動されます。
これはあなたが望むものではありません。私が理解しているように、リストをスクロールしたときにリストビューの上部に表示されるイメージを知りたいとします。ここでそれを行う方法です。
まず、 ScrollViewerを削除します。 ListViewにはすでにScrollViewerがあります。
<ListView x:Name="listViewImage" Grid.Row="0" HorizontalAlignment="Center" ItemsSource="{x:Bind ImagePages, Mode=OneWay}"
Loaded="listViewImage_Loaded">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="BitmapImage">
<Image Source="{x:Bind }" Margin="0 2"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListView>
ListViewに名前を付けて、Loadedイベントハンドラを追加しました。このハンドラでは、ListView内のScrollViewerを見つけて、ViewChangedイベントにハンドラをアタッチします。
private void listViewImage_Loaded(object sender, RoutedEventArgs e)
{
Border b = VisualTreeHelper.GetChild(listViewImage, 0) as Border;
ScrollViewer sv = b.Child as ScrollViewer;
sv.ViewChanged += Sv_ViewChanged;
}
ビューが変更されたハンドラでは、最初に表示されているListViewItemを見つけてコレクション内のインデックスを取得します。これはあなたが望むものです。
private void Sv_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
ScrollViewer sv = sender as ScrollViewer;
GeneralTransform gt = sv.TransformToVisual(this);
Point p = gt.TransformPoint(new Point(0, 0));
List<UIElement> list = new List<UIElement>(VisualTreeHelper.FindElementsInHostCoordinates(p, sv));
ListViewItem item = list.OfType<ListViewItem>().FirstOrDefault();
if(item != null)
{
int index = listViewImage.IndexFromContainer(item);
Debug.WriteLine("Visible item at top of list is " + index);
}
}
「Xamarin.UWP」のようなものはありません.UWPアプリは単なるUWPアプリです。 – Jason
@Jasonは、Xamarinフォームプロジェクトから生成されるUWPアプリケーションを意味します。これは確かに可能です。 – AQuirky