如何以编程方式设置WP7中选定的Panorama项目

我在WP7应用程序中使用全景控件。 其中一个PanoramaItem将您带到另一个页面,然后允许您通过EmailComposeTask发送电子邮件。 如果您未选择发送电子邮件并按后退按钮,则Panorama将返回上次选择的项目。 但是,如果您选择发送电子邮件(因此离开应用程序),则不会返回先前选择的PanoramaItem。 相反,它返回到Panorama中的第一个项目。 我试着跟踪所选索引并设置它,但是我收到一条错误,说SelectedIndex不可设置。 这已在MSDN文档中得到确认http://msdn.microsoft.com/en-us/library/microsoft.phone.controls.panorama.selectedindex%28VS.92%29.aspx

有没有办法在全景图上手动设置所选索引/项目? 如果没有,有没有办法让它记住所选的内容,即使用户离开应用程序撰写电子邮件?

我不确定您是否可以以编程方式将动画强制转换为另一个PanoramaItem ,但您可以更改Panorama.DefaultItem 。

所以你可能有3个PanoramaItem ,并且在OnNavigatedTo()处理程序上,通过以下方式更改默认项:

 panoramaControl.DefaultItem = panoramaControl.Items[indexToSet]; 

当你从墓碑中恢复时,这应该会有所帮助。

您可以尝试Silicon Shark在此主题中发布的解决方案。 它被注意到工作,但只在初始显示 – 这不应该是你在墓碑后恢复状态的要求的问题。

如何以编程方式设置Panorama控件中的可见项?

您可以从全景图的SelectedIndex属性中获取当前活动的页面。

不幸的是,设置DefualtItem只是解决这个问题的近似值,您可能已经发现了这个问题。

编辑:请注意,设置DefaultItem会更改全景图的哪一页是第一页。 这是一个微妙的差异,但你会看到标题的位置和背景图像的环绕是如何重要的。

这是一个解决方案。 它确实按预期工作,不会重新排列全景,因此您的用户界面是一致的。

 pan.SetValue(Panorama.SelectedItemProperty, panoramaItem); Panorama temp = pan; LayoutRoot.Children.Remove(pan); LayoutRoot.Children.Add(temp); LayoutRoot.UpdateLayout(); 

这不是一个完美的解决方案,因为它不像全景应该滑动得很好,而且它可能效率不高,但另一方面你没有改变默认项目,所以你的用户界面保持一致。

我测试了这里列出的解决方案没有成 这就是我所做的,就像魅力一样!

 PanoramaItem panItem = (PanoramaItem)panorama.Items[1]; panorama.Items.Remove(panItem); panorama.Items.Insert(0, panItem); 

您需要从列表中删除面板并将其重新插入所需位置!

设置新选择的项目

 pan.SetValue(Panorama.SelectedItemProperty, pan.Items[newSelectedItem]); 

但是,它仅适用于初始阶段,因此我的想法是在更改所选项目时让全景控件重新初始化。 这是我的代码,只需在Panorama.SelectedItem更改后添加此代码。

 (pan.Items[curIndex] as PanoramaItem).Visibility = Visibility.Collapsed; pan.SetValue(Panorama.SelectedItemProperty, pan.Items[(curIndex + 1) % pan.Items.Count]); pan.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); (pan.Items[curIndex] as PanoramaItem).Visibility = Visibility.Visible; 

但现在没有过渡效应! 虽然,你可以创造自己。

它对我很有用,这个页面也可以创建一个滑动效果http://xme.im/slide-or-change-panorama-selected-item-programatically

当设备进入横向视图时,我正在使用此模型更改为轴,我可能最终将当前项提取到应用程序状态。 全景是横向的禁区。

 private int hub_page_index; protected override void OnOrientationChanged(OrientationChangedEventArgs e) { base.OnOrientationChanged(e); if (panorama.Visibility == Visibility.Visible) { hub_page_index = panorama.SelectedIndex; } else if (pivot.Visibility == Visibility.Visible) { hub_page_index = pivot.SelectedIndex; } if (e.Orientation == PageOrientation.Landscape || e.Orientation == PageOrientation.LandscapeLeft || e.Orientation == PageOrientation.LandscapeRight) { // Display Pivot in Landscape orientation pivot.SetValue(Pivot.SelectedItemProperty, pivot.Items[panorama.SelectedIndex]); panorama.Visibility = Visibility.Collapsed; pivot.Visibility = Visibility.Visible; } else { // Display Panorama in Portrait orientation panorama.SetValue(Panorama.SelectedItemProperty, panorama.Items[pivot.SelectedIndex]); pivot.Visibility = Visibility.Collapsed; panorama.Visibility = Visibility.Visible; } }