在GridView中设置默认的ScrollViewer位置/显示元素

时间:2014-06-29 03:32:15

标签: winrt-xaml windows-8.1 windows-phone-8.1 win-universal-app

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

            <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的加载事件也是如此。无论如何都要将网格视图水平滚动到Bound SelectedItem

这是我用来调用ScrollToHorizo​​ntalOffset的代码

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

由于

2 个答案:

答案 0 :(得分:0)

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

你可以实现它

HorizontalScrollBarVisibility="Visible"的{​​{1}}和ScrollViewer中设置GridView.Template 使用ScrollViewer.ScrollToHorizontalOffset(your desire offset)ScrollViewer.ChangeView(your desire offset, 0, 1)滚动到特定的偏移量。

答案 1 :(得分:0)

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