【问题标题】:Equivalent of ItemAppearing in xamarin UWPItemAppearing 在 xamarin UWP 中的等效项
【发布时间】:2018-01-29 23:55:32
【问题描述】:

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

谢谢!

<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>

【问题讨论】:

  • 没有“Xamarin.UWP”之类的东西 - UWP 应用只是一个 UWP 应用。
  • @Jason,这意味着从 Xamarin Forms 项目生成的 UWP 应用。这确实是可能的。

标签: xamarin.forms xamarin.uwp


【解决方案1】:

对于初学者,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);
        }
    }

【讨论】:

  • 感谢您的解决方案。我会试试这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 2020-02-26
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多