0

我有一个绑定到gridview的项目列表,它在可用的屏幕区域上显示一个项目。我的想法是,我希望用户从可用集合中看到恰好一个项目,同时他能够水平滚动左侧或右侧以显示列表的下一个/上一个项目。为此,我使用了一个GridView以及一个SnapPoints启用的滚动查看器。我现在遇到的问题是,我无法让GridView显示默认选定项目,以便用户在打开页面后可以看到列表中的第4或第8个元素。我尝试通过更改页面加载后GridView的ScrollViewer的偏移量,但它似乎并没有工作,并始终显示所显示的绑定列表中的第一个元素。奇怪的行为是,一旦我调用ScrollToHorizo​​ntalOffset,滚动查看器的ViewChanged事件会被提升两次,第一个我可以清楚地看到偏移量已更新为我默认选定项目的位置,但第二个偏移量重置回到第一个项目。 Bellow它是我用于网格视图的xaml片段。在GridView中设置默认的ScrollViewer位置/显示元素

  <GridView x:Name="ContentRoot" 
      Grid.Row="1" 
      IsSwipeEnabled="True" 
      IsItemClickEnabled="false" 
      ItemsSource="{Binding CurrentWorkout.Exercises}" 
      SelectedItem="{Binding CurrentExercise}"    
       > 
      <GridView.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="Auto" /> 
          <RowDefinition Height="Auto" /> 
          <RowDefinition Height="*" /> 
         </Grid.RowDefinitions> 
         <Image Source="{Binding LargeImagePath}" Width="160" Height="160" HorizontalAlignment="Center" 
          VerticalAlignment="Top" Margin="20,10" /> 
         <TextBlock Grid.Row="1" Text="{Binding Name}" Margin="24,10" FontSize="30" VerticalAlignment="Top" 
         Style="{StaticResource BaseTextBlockStyle}" HorizontalAlignment="Center" TextAlignment="Center" 
         TextWrapping="Wrap" Typography.Capitals="SmallCaps" IsTextScaleFactorEnabled="False" /> 
         <ScrollViewer Grid.Row="2"> 
          <TextBlock Text="{Binding Description}" Margin="24" Style="{StaticResource BaseTextBlockStyle}" 
           HorizontalAlignment="Center" TextAlignment="Center" VerticalAlignment="Top" 
           TextWrapping="Wrap" Typography.Capitals="SmallCaps" IsTextScaleFactorEnabled="False" /> 
         </ScrollViewer> 
        </Grid> 
       </DataTemplate> 
      </GridView.ItemTemplate> 
      <GridView.ItemsPanel> 
       <ItemsPanelTemplate> 
        <WrapGrid ItemWidth="380" Loaded="FrameworkElement_OnLoaded" 
          HorizontalAlignment="Stretch" VerticalAlignment="Top" IsTapEnabled="False" 
          /> 
       </ItemsPanelTemplate> 
      </GridView.ItemsPanel> 
      <GridView.Template> 
       <ControlTemplate TargetType="GridView"> 
        <ScrollViewer HorizontalScrollBarVisibility="Disabled" HorizontalScrollMode="Enabled" 
            VerticalScrollMode="Disabled" VerticalScrollBarVisibility="Disabled" 
            x:Name="GridScrollViewer" HorizontalSnapPointsType="MandatorySingle" 
            HorizontalSnapPointsAlignment="Near" 
            ViewChanged="ScrollViewer_OnViewChanged"> 
         <ItemsPresenter /> 
        </ScrollViewer> 
       </ControlTemplate> 
      </GridView.Template> 
     </GridView> 

我从页面加载事件调用ScrollToHorizo​​ntalOffset。我也尝试了ScrollViewer加载的事件,并得到相同的行为。 GridView的加载事件也是如此。反正是有水平得到了绑定的SelectedItem网格视图滚动

这是我使用调用ScrollToHorizo​​ntalOffset

 int offset = (int)GetItemWidth(mainScrollViewer) * 
        (App.Locator.LearnWorkoutExercicesViewModel.CurrentExerciseIndex + 1); 
     mainScrollViewer.ScrollToHorizontalOffset(offset); 

感谢

+0

您是否能够找出为什么ViewChanged被调用两次? –

回答

0

从您的查询的分析代码,我注意到你已经设置了HorizontalScrollBarVisibility="Disabled"。在GridView.Template 如果禁用水平滚动条可见性是不是你的要求, 您可以通过

GridView.Template和 使用ScrollViewer.ScrollToHorizontalOffset(your desire offset)ScrollViewerScrollViewer.ChangeView(your desire offset, 0, 1)塞汀HorizontalScrollBarVisibility="Visible"滚动到特定的偏移实现它。

0

这是一个相当晚的答案,但您试图实现的结果(1个显示的项目,从一个项目滚动到另一个项目时捕捉到位)似乎是FlipView的确切定义。你有没有考虑过使用FlipView而不是GridView?