C# Flipview没有';从邮件应用程序通过启动器返回后,不要维护selectedindex

C# Flipview没有';从邮件应用程序通过启动器返回后,不要维护selectedindex,c#,xaml,windows-phone,windows-phone-8.1,winrt-xaml,C#,Xaml,Windows Phone,Windows Phone 8.1,Winrt Xaml,我面临FlipView的一个问题。我正在分享这个简约的项目,它代表了我在原始应用程序中的用例 我有两页。首先是MainPage.xaml。它有一个五次的flipview。前四个只有文本块,第五个只有一个按钮。单击它,我将被重定向到Next.xaml。请注意,主页上的NavigationCacheMode为NavigationCacheMode.Required[这是我的原始应用程序所必需的]。所以FlipView的最后一个已知索引是4 在下一页中,有一个按钮点击它,通过launcher打开邮件客

我面临FlipView的一个问题。我正在分享这个简约的项目,它代表了我在原始应用程序中的用例

我有两页。首先是MainPage.xaml。它有一个五次的flipview。前四个只有文本块,第五个只有一个按钮。单击它,我将被重定向到Next.xaml。请注意,主页上的NavigationCacheMode为NavigationCacheMode.Required[这是我的原始应用程序所必需的]。所以FlipView的最后一个已知索引是4

在下一页中,有一个按钮点击它,通过launcher打开邮件客户端。现在,当我从邮件客户端按back时,我将被导航到下一页,再按一次back,我将在主页上,选择的索引将是4,这是正确的。现在,当我向右滑动以查看索引为3的FlipViewItem时,它会立即显示第一个索引为0的FlipViewItem。它只是跳过所有项,直到索引为0

代码中有什么错误吗

MainPage.Xaml

<Grid Grid.Row="1" x:Name="ContentRoot">
    <FlipView x:Name="fv">
        <FlipViewItem>
            <TextBlock Text="1" FontSize="50" />
        </FlipViewItem>
        <FlipViewItem>
            <TextBlock Text="2" FontSize="50" />
        </FlipViewItem>
        <FlipViewItem>
            <TextBlock Text="3" FontSize="50" />
        </FlipViewItem>
        <FlipViewItem>
            <TextBlock Text="4" FontSize="50" />
        </FlipViewItem>
        <FlipViewItem>
            <Button Content="Next" Click="btnNext_Click" />
        </FlipViewItem>
    </FlipView>
</Grid>
Next.xaml(未设置NavigationCacheMode)


这似乎是一个已知的错误,当您在缓存页面中返回到
FlipView
控件时,它会影响该控件。不确定最佳解决方法是什么,但您可以尝试一些方法-在
FlipView的
模板中的
ScrollViewer
上调用
InvalidateScrollInfo()
,重置
SelectedIndex
值(可能将其设置为其他值,然后立即设置为上一个值),甚至可能重置
项目资源

以支持菲利普·斯卡昆的回答(我太低了,无法发表评论。)

DeviceUtility.FindControl(this.FlipView,typeof(ScrollViewer)).InvalidateScrollInfo();
公共静态列表GetAllChildControls(DependencyObject父对象)
{
var controList=新列表();
for(int i=0;ix.GetType().Equals(controlType)).Cast().First();
返回控制;
}

我想我最近才看到它,它是FlipView中的一个bug。让我给你回复最佳解决方案。它与WinRT XAML工具包有什么关系?你的意思是仅仅WinRT XAML吗?很抱歉,我想添加,但我添加错了。有人能告诉我有关如何以及在何处调用此
InvalidateScrollInfo()
方法的详细信息吗?
public MainPage()
{
    this.InitializeComponent();

    this.navigationHelper = new NavigationHelper(this);
    this.navigationHelper.LoadState += this.NavigationHelper_LoadState;
    this.navigationHelper.SaveState += this.NavigationHelper_SaveState;

    NavigationCacheMode = NavigationCacheMode.Required;
}
private void btnNext_Click(object sender, RoutedEventArgs e)
{
    Frame.Navigate(typeof(Next));
}
<Grid Grid.Row="1" x:Name="ContentRoot">
    <Button Content="Mail" Click="btnMail_Click" />
</Grid> 
private async void btnMail_Click(object sender, RoutedEventArgs e)
{
    var mailto = "mailto:?to=windows@microsoft.com&subject=Email&body=body";
    await Windows.System.Launcher.LaunchUriAsync(new Uri(mailto));
}
    DeviceUtility.FindControl<ScrollViewer>(this.FlipView, typeof(ScrollViewer)).InvalidateScrollInfo();

    public static List<UIElement> GetAllChildControls(DependencyObject parent)
    {
        var controList = new List<UIElement>();
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            var childControl = VisualTreeHelper.GetChild(parent, i);
            if (childControl is UIElement)
            {
                controList.Add(childControl as UIElement);
            }
            controList.AddRange(GetAllChildControls(childControl));
        }
        return controList;
    }

    public static T FindControl<T>(DependencyObject parentContainer, Type controlType)
    {
        var childControls = GetAllChildControls(parentContainer);
        var control = childControls.OfType<UIElement>().Where(x => x.GetType().Equals(controlType)).Cast<T>().First();
        return control;
    }