相当于在Xamarin UWP中的ItemAppearing

时间:2017-08-21 20:27:05

标签: xamarin.forms xamarin.uwp

我有一个ListView绑定到BitmapImage列表。 我想通过此列表滚动时获取当前图像的索引。 但是,我注意到UWP中没有ItemAppearing属性,但它存在于Xamarin Forms中。 如何获取当前项目的索引?

谢谢!

add(btn, BorderLayout.NORTH);

1 个答案:

答案 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);
        }
    }