我有一个ListView绑定到BitmapImage列表。 我想通过此列表滚动时获取当前图像的索引。 但是,我注意到UWP中没有ItemAppearing属性,但它存在于Xamarin Forms中。 如何获取当前项目的索引?
谢谢!
add(btn, BorderLayout.NORTH);
答案 0 :(得分:0)
首先,ItemAppearing属性不是您要查找的行为。呈现列表项时会触发Xamarin Forms中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);
}
}