通过启动器从邮件应用程序返回后,Flipview 不维护 selectedindex
Flipview doesn't maintain selectedindex after returning from mail app via launcher
我遇到了 FlipView 的问题。我正在分享简约项目,它代表了我在原始应用程序中的用例,http://1drv.ms/163kHCR。
我有两个页面。首先是 MainPage.xaml。它有五次翻转视图。前四个只有文本块,第五个只有一个按钮。单击它我将被重定向到 Next.xaml。请注意 MainPage 的 NavigationCacheMode 为 NavigationCacheMode.Required [这是我的原始应用程序所必需的]。所以 FlipView 的最后一个已知索引是 4.
在下一页中有一个按钮,点击它,通过启动器打开邮件客户端。现在,当我从邮件客户端按回时,我将导航到下一页并再按一次,我将在 MainPage 上并且选择的索引将为 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>
MainPage.Xaml.cs
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));
}
Next.xaml(未设置 NavigationCacheMode)
<Grid Grid.Row="1" x:Name="ContentRoot">
<Button Content="Mail" Click="btnMail_Click" />
</Grid>
Next.xaml.cs
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));
}
这似乎是一个已知错误,当您在缓存页面中返回 FlipView
控件时会影响它。不确定最好的解决方法是什么,但您可以尝试一些方法 - 在 FlipView's
模板中的 ScrollViewer
上调用 InvalidateScrollInfo()
,重置 SelectedIndex
值(也许设置它到其他一些值,然后立即到前一个),甚至可能重置 ItemsSource
.
支持 Filip Skakun 的回答(我太低级了,无法 post 发表评论。)
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;
}
我遇到了 FlipView 的问题。我正在分享简约项目,它代表了我在原始应用程序中的用例,http://1drv.ms/163kHCR。
我有两个页面。首先是 MainPage.xaml。它有五次翻转视图。前四个只有文本块,第五个只有一个按钮。单击它我将被重定向到 Next.xaml。请注意 MainPage 的 NavigationCacheMode 为 NavigationCacheMode.Required [这是我的原始应用程序所必需的]。所以 FlipView 的最后一个已知索引是 4.
在下一页中有一个按钮,点击它,通过启动器打开邮件客户端。现在,当我从邮件客户端按回时,我将导航到下一页并再按一次,我将在 MainPage 上并且选择的索引将为 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>
MainPage.Xaml.cs
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));
}
Next.xaml(未设置 NavigationCacheMode)
<Grid Grid.Row="1" x:Name="ContentRoot">
<Button Content="Mail" Click="btnMail_Click" />
</Grid>
Next.xaml.cs
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));
}
这似乎是一个已知错误,当您在缓存页面中返回 FlipView
控件时会影响它。不确定最好的解决方法是什么,但您可以尝试一些方法 - 在 FlipView's
模板中的 ScrollViewer
上调用 InvalidateScrollInfo()
,重置 SelectedIndex
值(也许设置它到其他一些值,然后立即到前一个),甚至可能重置 ItemsSource
.
支持 Filip Skakun 的回答(我太低级了,无法 post 发表评论。)
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;
}