WP8 Scrollviewer 未在页面之间重置 (WinRT)

WP8 Scrollviewer is not resetting between pages (WinRT)

我正在开发 WP8 WinRT 应用程序。在我的 DetailPage.xaml 上,我有一个包含 ListView 和图像的 ScrollViewer。

ScrollViewer 工作正常,只是当我在页面之间导航时它不会自行重置。

如果我向下滚动到页面 A 的底部,然后导航到页面 B,则滚动查看器会显示内容的底部,而不是从顶部开始,然后让我再次向下滚动。

这是我的详细信息页面中的XAML:

<Page x:Class="LinuxBasics.RecipeDetailPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="using:LinuxBasics"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:data="using:LinuxBasics.DataModel"
  mc:Ignorable="d"
  d:DataContext="{Binding AllGroups[1].Items[1], Source={d:DesignInstance Type=data:SampleDataSource, IsDesignTimeCreatable=True}}"
  DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}">

<Page.Transitions>
    <TransitionCollection>
        <NavigationThemeTransition>
            <NavigationThemeTransition.DefaultNavigationTransitionInfo>
                <CommonNavigationTransitionInfo IsStaggeringEnabled="True" />
            </NavigationThemeTransition.DefaultNavigationTransitionInfo>
        </NavigationThemeTransition>
    </TransitionCollection>
</Page.Transitions>

<Page.Resources>

</Page.Resources>
<!--<Page.BottomAppBar>
    <CommandBar>
        <AppBarButton x:Name="btnPinToStart" Icon="Pin" Click="btnPinToStart_Click" Label="Like"/>
        <AppBarButton x:Name="btnReminderTimer" Icon="Clock" Label="timer" Click="btnReminderTimer_Click"/>
        <AppBarButton x:Name="btnBrag" Icon="Camera" Label="brag">
            <AppBarButton.Flyout>
                <MenuFlyout>
                    <MenuFlyoutItem x:Name="menuPhoto" Text="Photo" Click="menuPhoto_Click"/>
                    <MenuFlyoutSeparator/>
                    <MenuFlyoutItem x:Name="menuVideo" Text="Video" Click="menuVideo_Click"/>
                </MenuFlyout>
            </AppBarButton.Flyout>
        </AppBarButton>
    </CommandBar>
</Page.BottomAppBar>-->


<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
      x:Name="LayoutRoot3"
      CommonNavigationTransitionInfo.IsStaggerElement="True"
      DataContext="{Binding Item}"
      d:DataContext="{Binding}">

    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />

    </Grid.RowDefinitions>

    <StackPanel x:Name="TitlePanel"
                Grid.Row="0"
                Margin="20,12,0,28">

        <TextBlock x:Name="AppTiltle"
                   Text="LINUX BASICS"
                   Style="{ThemeResource TitleTextBlockStyle}"
                   Typography.Capitals="SmallCaps" />

        <TextBlock x:Name="AppCommand"
                   d:DataContext="{Binding}"
                   Text="{Binding Title}"
                   Margin="0,12,0,0"
                   TextWrapping="Wrap"
                   Style="{ThemeResource HeaderTextBlockStyle}" />

    </StackPanel>

    <Grid x:Name="RecipePanel"
          Grid.Row="1">

    </Grid>
    <ScrollViewer Grid.Row="1"
                  Margin="0,10">
        <StackPanel>

        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>

            <ListView ItemsSource="{Binding Ingredients}"
                      x:Uid="RecipeIngredientsPivotItem"
                      Grid.Row="0"
                      Margin="20,12,10,10">
                <ListView.ItemTemplate>
                    <DataTemplate>

                        <TextBlock Text="{Binding Mode=OneWay}"
                                   Style="{ThemeResource BodyTextBlockStyle}" />

                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

            <Image Source="{Binding ImagePath}"
                   Stretch="UniformToFill"
                   VerticalAlignment="Center"
                   HorizontalAlignment="Center"
                   Margin="20,20,10,20"
                   Grid.Row="1"/>

        </Grid>
    </StackPanel>
</ScrollViewer>
</Grid>

这是背后的代码:

public sealed partial class RecipeDetailPage : Page
{
    private NavigationHelper navigationHelper;
    private ObservableDictionary defaultViewModel = new ObservableDictionary();

    /// <summary>
    /// NavigationHelper is used on each page to aid in navigation and 
    /// process lifetime management
    /// </summary>
    public NavigationHelper NavigationHelper
    {
        get { return this.navigationHelper; }
    }

    /// <summary>
    /// This can be changed to a strongly typed view model.
    /// </summary>
    public ObservableDictionary DefaultViewModel
    {
        get { return this.defaultViewModel; }
    }

    public RecipeDetailPage()
    {
        this.InitializeComponent();

        this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Required;

        this.navigationHelper = new NavigationHelper(this);
        this.navigationHelper.LoadState += navigationHelper_LoadState;
    }

    /// <summary>
    /// Populates the page with content passed during navigation.  Any saved state is also
    /// provided when recreating a page from a prior session.
    /// </summary>
    /// <param name="sender">
    /// The source of the event; typically <see cref="NavigationHelper"/>
    /// </param>
    /// <param name="e">Event data that provides both the navigation parameter passed to
    /// <see cref="Frame.Navigate(Type, Object)"/> when this page was initially requested and
    /// a dictionary of state preserved by this page during an earlier
    /// session.  The state will be null the first time a page is visited.</param>
    private async void navigationHelper_LoadState(object sender, LoadStateEventArgs e)
    {
        var item = await RecipeDataSource.GetItemAsync((String)e.NavigationParameter);
        this.DefaultViewModel["Group"] = item.Group;
        this.DefaultViewModel["Item"] = item;

        //// Is recipe already pinned?
        //if (SecondaryTile.Exists(item.UniqueId))
        //    btnPinToStart.Icon = new SymbolIcon(Symbol.UnPin);
    }


    #region NavigationHelper registration

    /// The methods provided in this section are simply used to allow
    /// NavigationHelper to respond to the page's navigation methods.
    /// 
    /// Page specific logic should be placed in event handlers for the  
    /// <see cref="GridCS.Common.NavigationHelper.LoadState"/>
    /// and <see cref="GridCS.Common.NavigationHelper.SaveState"/>.
    /// The navigation parameter is available in the LoadState method 
    /// in addition to page state preserved during an earlier session.

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        navigationHelper.OnNavigatedTo(e);
    }

    protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        navigationHelper.OnNavigatedFrom(e);
    }

    #endregion


}

补充一点,在我从我正在使用的应用程序示例中删除 Pivots 之前,ScrollViewer 工作正常。

我想通了。

我的 DetailsPage 顶部的页面转换(从 Pivot 遗留)导致了意外行为。

如有必要,请随时删除此 post ...