2017-07-20 8 views
0

私のアプリでは、メインページにGridViewListViewの1つを使用しています。前述のリストはDictionaryにあり、私はContentPresenterの内容としてメインページにロードし、この要素はScrollViewerにまとめられています。メインページのためGridView/ListViewビューへのスクロールが機能しない

XAML:辞書クラスの

<Pivot Grid.Row="1" 
      SelectionChanged="Pivot_SelectionChanged" 
      SelectedIndex="{Binding PivotIndex, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"> 
     <PivotItem> 
      <PivotItem.Header> 
       <TextBlock Text="Home"/> 
      </PivotItem.Header> 
      <PivotItem.Content> 
       <ScrollViewer ViewChanged="Scroll_ViewChanged"> 
        <ContentPresenter ContentTemplate="{StaticResource SwitchableHomeView}"/> 
       </ScrollViewer> 
      </PivotItem.Content> 
     </PivotItem> 
     <PivotItem> 
      <PivotItem.Header> 
       <TextBlock Text="Fitness"/> 
      </PivotItem.Header> 
      <PivotItem.Content> 
       <ScrollViewer ViewChanged="Scroll_ViewChanged"> 
        <ContentPresenter ContentTemplate="{StaticResource SwitchableFitnessView}"/> 
       </ScrollViewer> 
      </PivotItem.Content> 
     </PivotItem> 
    </Pivot> 

およびXAML:

<DataTemplate x:Key="SwitchableHomeView" 
       x:DataType="data:ItemHelper"> 
    <UserControl> 
     <StackPanel> 
      <VisualStateManager.VisualStateGroups> 
       <VisualStateGroup> 
        <VisualState> 
         <VisualState.StateTriggers> 
          <AdaptiveTrigger MinWindowWidth="0"/> 
         </VisualState.StateTriggers> 
         <VisualState.Setters> 
          <Setter Target="HomeListView.Visibility" 
            Value="Visible"/> 
          <Setter Target="HomeGridView.Visibility" 
            Value="Collapsed"/> 
         </VisualState.Setters> 
        </VisualState> 
        <VisualState> 
         <VisualState.StateTriggers> 
          <AdaptiveTrigger MinWindowWidth="901"/> 
         </VisualState.StateTriggers> 
         <VisualState.Setters> 
          <Setter Target="HomeListView.Visibility" 
            Value="Collapsed"/> 
          <Setter Target="HomeGridView.Visibility" 
            Value="Visible"/> 
         </VisualState.Setters> 
        </VisualState> 
       </VisualStateGroup> 
      </VisualStateManager.VisualStateGroups> 
      <ListView Name="HomeListView" 
         Style="{StaticResource ListViewCustomStyle}" 
         ItemsSource="{Binding HomeList, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" 
         ItemClick="Article_ItemClick" 
         Loaded="ArticleCollection_Loaded"/> 
      <GridView Name="HomeGridView" 
         Style="{StaticResource GridViewCustomStyle}" 
         ItemsSource="{Binding HomeList, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" 
         ItemClick="Article_ItemClick" 
         Loaded="ArticleCollection_Loaded"/> 
     </StackPanel> 
    </UserControl> 
</DataTemplate> 

    <Style x:Key="GridViewCustomStyle" 
     TargetType="GridView"> 
    <Setter Property="SelectionMode" 
      Value="None"/> 
    <Setter Property="ItemsPanel" 
      Value="{StaticResource GridViewCenteredItemsPanel}"/> 
    <Setter Property="IsItemClickEnabled" 
      Value="True"/> 
    <Setter Property="ShowsScrollingPlaceholders" 
      Value="True"/> 
    <Setter Property="ItemContainerStyle" 
      Value="{StaticResource CustomGridViewItemStyle}"/> 
    <Setter Property="ItemTemplate" 
      Value="{StaticResource CustomGridItemTemplate}"/> 
    <Setter Property="ItemContainerTransitions" 
      Value="{StaticResource GridViewItemCustomTransitions}"/> 
</Style> 

<Style x:Key="ListViewCustomStyle" 
     TargetType="ListView"> 
    <Setter Property="SelectionMode" 
      Value="None"/> 
    <Setter Property="IsItemClickEnabled" 
      Value="True"/> 
    <Setter Property="ShowsScrollingPlaceholders" 
      Value="True"/> 
    <Setter Property="ItemContainerStyle" 
      Value="{StaticResource StretchedListView}"/> 
    <Setter Property="ItemTemplate" 
      Value="{StaticResource CustomListItemTemplate}"/> 
    <Setter Property="ItemContainerTransitions" 
      Value="{StaticResource GridViewItemCustomTransitions}"/> 
</Style> 

辞書クラスのコードビハインド:

private async void ArticleCollection_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (navigatedUri != null) 
     { 
      if (sender is GridView) 
      { 
       var gv = sender as GridView; 

       var item = (gv.ItemsSource as ObservableCollection<ItemHelper>) 
         .Where(compare => compare.ItemImage?.UriSource?.OriginalString == navigatedUri).FirstOrDefault(); 
       await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => 
       { 
        gv.UpdateLayout(); 
        await Task.Delay(500); 
        gv.ScrollIntoView(item); 
        //gv.UpdateLayout(); 
       }); 

       var animation = ConnectedAnimationService.GetForCurrentView().GetAnimation(StaticProperties.SquareAnimationKey); 
       if (animation != null) 
       { 
        if (gv.ContainerFromItem(item) is GridViewItem container) 
        { 
         var root = (FrameworkElement)container.ContentTemplateRoot; 
         var image = (Image)root.FindName("Image"); 
         animation.TryStart(image); 
        } 
        else 
        { 
         animation.Cancel(); 
        } 
       } 
       if (gv.Visibility == Visibility.Visible) 
       { 
        navigatedUri = null; 
       } 
      } 
      else if (sender is ListView) 
      { 
       var gv = sender as ListView; 
       var animation = ConnectedAnimationService.GetForCurrentView().GetAnimation(StaticProperties.SquareAnimationKey); 
       if (animation != null) 
       { 
        var item = (gv.ItemsSource as ObservableCollection<ItemHelper>) 
         .Where(compare => compare.ItemImage?.UriSource?.OriginalString == navigatedUri).First(); 
        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => 
        { 
         gv.UpdateLayout(); 
         await Task.Delay(500); 
         gv.ScrollIntoView(item); 
         //gv.UpdateLayout(); 
        }); 

        if (gv.ContainerFromItem(item) is GridViewItem container) 
        { 
         var root = (FrameworkElement)container.ContentTemplateRoot; 
         var image = (Image)root.FindName("image"); 
         // Wait for image opened. In future Insider Preview releases, this won't be necessary. 
         image.Opacity = 0; 
         animation.TryStart(image); 
        } 
        else 
        { 
         animation.Cancel(); 
        } 
       } 
       if (gv.Visibility == Visibility.Visible) 
       { 
        navigatedUri = null; 
       } 
      } 
     } 
    } 

私はに従ってListViewGridViewを切り替えます画面サイズ。アイテムを表示した後にMainPageに戻ると、ListViewGridViewの両方がロードされ、Loadedイベントが発生します。 ListViewGridViewをその項目にスクロールしますが、常に最初の項目が表示されます。私はGoogleからさまざまなソリューションを試してみましたが、誰も私のために働いていません。

だから私はそれが機能するように正しいアプローチを使用しているかどうか尋ねたいと思います。あるいは、この仕事をするためにできることは何か良いことがあります。ありがとう

答えて

1

PivotItem ContentTemplatesからScrollViewerを削除すると機能することがあります。 GridViewには、ScrollIntoViewが使用しようとする内部ScrollViewerがあります。しかし、GridViewをスクロールビューア内に配置したため、内部のスクロールビューアは使用されません。GridViewが親ScrollViewerによって無制限にサイズが与えられたためです。

+0

はい私はテンプレートを少し微調整しました親の 'ScrollViewer'を削除しなければなりませんでした。 – Ahmar

関連する問題