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

13
我正在使用WP7应用程序中的全景控件。其中一个PanoramaItem带您到另一页,然后允许您通过EmailComposeTask发送电子邮件。如果您不选择发送电子邮件并按下返回按钮,则全景会返回到您最后选择的项目。但是,如果您选择发送电子邮件(因此离开应用程序),它不会返回到先前选择的PanoramaItem。相反,它返回到全景中的第一个项目。我尝试跟踪所选索引并设置它,但我收到一个错误,指出SelectedIndex不可设置。MSDN文档确认了这一点http://msdn.microsoft.com/en-us/library/microsoft.phone.controls.panorama.selectedindex%28VS.92%29.aspx
有没有办法手动设置全景的选定索引/项?如果没有,是否有办法使其记住选择了什么,即使用户离开应用程序来撰写电子邮件?

在我上一条评论中关于DefaultItem的澄清后已更新。 - Mick N
我在这里回答了:https://dev59.com/sXXYa4cB1Zd3GeqP2yQ3#27018310 - Rivenfall
6个回答

34

我不确定你是否可以通过编程强制将动画切换到另一个PanoramaItem,但是你可以更改Panorama.DefaultItem

所以你可能有3个PanoramaItem,在OnNavigatedTo()处理程序中,通过更改默认项来实现:

panoramaControl.DefaultItem = panoramaControl.Items[indexToSet];

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


1
它可以正确地导航,但是我们如何在导航时添加动画效果? - 1Mayur
对我来说,这改变了全景标题的起始位置。也许是因为我应用了自定义标题模板。 - Rivenfall

7

你可以尝试在该帖子中发布的Silicon Shark的解决方案。据说它有效,但仅适用于初始显示 - 这对你恢复墓碑状态的要求不应该是个问题。

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

你可以从全景控件的SelectedIndex属性中获取当前活动页面。

不幸的是,设置DefualtItem只是近似解决此问题的方法,你可能已经发现了。

编辑:请注意,设置DefaultItem会更改全景的第一页是哪一页。这是一个微妙的区别,但你将看到标题的定位和背景图像的环绕方式是有所不同的。


5

这里有一个解决方案。它可以按预期工作,而且不会重新排列您的全景图,因此您的用户界面保持一致。

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

这并不是一种完美的解决方案,因为它不能像全景一样平滑地滑动,而且可能不太高效,但另一方面,你不会改变默认项,因此用户界面保持一致。

你也许需要更积极地重新措辞前置条件,因为读起来并不太令人舒服,如果按照现在的方式,我可能不会完全放心地使用你的解决方案。 - Extra Savoir-Faire
这是正确的方法...可惜没有滑动效果,不过它不会重新排列用户界面。我加2分。 - Billy Ray Valentine

3

我尝试了这里列出的解决方案,但都没有成功。以下是我的方法,它可以完美地解决问题!

PanoramaItem panItem = (PanoramaItem)panorama.Items[1];

panorama.Items.Remove(panItem);

panorama.Items.Insert(0, panItem);

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

2

通过以下方法设置新的所选项目:

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

1

我正在使用这个模型来在设备进入横向视图时切换到一个中心轴,我可能会将当前项提取到应用程序状态中。全景图在横向方向上是不可用的。

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;
    }
}

不错。你应该修剪代码,这样解决方案就更明显了。我差点跳过你的代码,因为它似乎与问题无关,但结果证明它解决了我的问题。 - Mathias Lykkegaard Lorenzen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接