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

时间:2011-01-07 03:15:57

标签: c# silverlight xaml windows-phone-7

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

上得到了确认

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

6 个答案:

答案 0 :(得分:34)

我不确定您是否可以通过编程方式将动画强制转换为其他PanoramaItem,但您可以更改Panorama.DefaultItem

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

panoramaControl.DefaultItem = panoramaControl.Items[indexToSet];

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

答案 1 :(得分:7)

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

How to programmatically set the visible item in a Panorama control?

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

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

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

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:3)

我测试了此处列出的解决方案但没有成功。这就是我所做的,就像一个魅力!

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

panorama.Items.Remove(panItem);

panorama.Items.Insert(0, panItem);

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

答案 4 :(得分: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

的效果

答案 5 :(得分: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;
    }
}