2017-08-21 14 views
1

J'ai une liaison ListView à la liste de BitmapImage. Je souhaite que l'index de l'image en cours soit mis au point lorsque je fais défiler cette liste. Mais, je remarque que la propriété ItemAppearing n'existe pas dans UWP mais elle est présente dans Xamarin Forms. Comment puis-je obtenir l'index de l'élément actuel en vue?Equivalent de ItemAppearing dans xamarin UWP

Merci!

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

Il n'existe pas de "Xamarin.UWP" - une application UWP est juste une application UWP. – Jason

+1

@Jason, il s'agit d'une application UWP générée à partir d'un projet Xamarin Forms. C'est en effet possible. – AQuirky

Répondre

0

Pour les démarreurs, la propriété ItemAppearing n'est pas le comportement que vous recherchez. L'événement ItemAppearing pour le ListView dans Xamarin Forms est déclenché lorsque l'élément de liste est rendu. Pour une petite liste, cet événement sera déclenché pour tous les articles immédiatement. L'événement équivalent dans UWP est l'événement ListView.ChoosingItemContainer qui, comme l'événement ItemAppearing, est déclenché à moins que la ListView soit virtualisée pour tous les éléments de la liste. Même pour une grande liste virtualisée, elle est déclenchée pour plusieurs pages d'éléments.

Ce n'est pas ce que vous voulez. Si je comprends bien, vous voulez connaître l'image qui est visible en haut de la liste lorsque la liste défile. Voici comment faire cela.

Tout d'abord. Débarrassez-vous du ScrollViewer. Le ListView a déjà un ScrollViewer à l'intérieur de celui-ci.

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

Notez que j'ai nommé le ListView et j'ai ajouté un gestionnaire d'événements Loaded. Dans ce gestionnaire, recherchez le ScrollViewer dans ListView et attachez un gestionnaire à l'événement 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; 
    } 

Dans le gestionnaire de vue modifié, recherchez le premier ListViewItem visible et récupérez son index dans la collection. Voici ce que tu veux.

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); 
     } 
    } 
+0

Merci pour la solution. Je vais essayer ça. – XamDev