Xamarin.forms xamarin UWP中出现的项目的等效项

Xamarin.forms xamarin UWP中出现的项目的等效项,xamarin.forms,xamarin.uwp,Xamarin.forms,Xamarin.uwp,我有一个绑定到BitmapImage列表的ListView。 当我滚动浏览此列表时,我想获得当前图像的索引。 但是,我注意到itemseapping属性在UWP中不存在,但在Xamarin形式中存在。 如何获取视图中当前项的索引 谢谢 <ScrollViewer Grid.Row="0" ZoomMode="{x:Bind ZoomMode, Mode=OneWay}" HorizontalScrollMode="Enabled" Horizon

我有一个绑定到BitmapImage列表的ListView。 当我滚动浏览此列表时,我想获得当前图像的索引。 但是,我注意到itemseapping属性在UWP中不存在,但在Xamarin形式中存在。 如何获取视图中当前项的索引

谢谢

<ScrollViewer Grid.Row="0" ZoomMode="{x:Bind ZoomMode, Mode=OneWay}" HorizontalScrollMode="Enabled"                       HorizontalScrollBarVisibility="Auto">
    <ListView HorizontalAlignment="Center" ItemsSource="{x:Bind ImagePages, Mode=OneWay}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate x:DataType="BitmapImage">
                        <Image Source="{x:Bind }" Margin="0 2" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ListView>
        </ScrollViewer>

对于初学者,itemseapping属性不是您要寻找的行为。呈现列表项时,将激发Xamarin表单中ListView的ItemExaming事件。对于小列表,将立即为所有项目触发此事件。UWP中的等效事件是ListView.ChoosingItemContainer事件,该事件与ItemExaming事件类似,除非为列表中的所有项目触发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>
在视图更改处理程序中,找到第一个可见的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);
        }
    }
private void Sv_ViewChanged(对象发送者,ScrollViewServiceChangedEventArgs e)
{
ScrollViewer sv=作为ScrollViewer的发送方;
GeneralTransform gt=sv.TransformToVisual(此);
点p=总转换点(新点(0,0));
列表=新列表(VisualTreeHelper.FindElementsInHostCoordinates(p,sv));
ListViewItem项=list.OfType().FirstOrDefault();
如果(项!=null)
{
int index=listViewImage.IndexFromContainer(项目);
Debug.WriteLine(“列表顶部可见项为”+索引);
}
}

没有“Xamarin.UWP”这样的东西-UWP应用程序只是一个UWP应用程序。@Jason,这意味着是一个由Xamarin表单项目生成的UWP应用程序。这确实是可能的。谢谢你的解决方案。我试试这个。
    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);
        }
    }