2017-08-21 8 views
1

私は、リストビューをBitmapImageのリストにバインドしています。 このリストをスクロールすると、現在のイメージのインデックスにフォーカスが移ります。 しかし、私はItemAppearingプロパティがUWPには存在しないが、Xamarinフォームにはそこにあることに気付きました。 現在のアイテムのインデックスを表示するにはどうすればよいですか?xamarinでItemAppearingに相当するUWP

ありがとうございます!

<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

「Xamarin.UWP」のようなものはありません.UWPアプリは単なるUWPアプリです。 – Jason

+1

@Jasonは、Xamarinフォームプロジェクトから生成されるUWPアプリケーションを意味します。これは確かに可能です。 – AQuirky

答えて

0

まず、ItemAppearingプロパティは、探している動作ではありません。 Xamarinフォームの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); 
     } 
    } 
+0

解決に感謝します。私はこれを試してみる。 – XamDev

関連する問題