【问题标题】:How to programmatically set selected Panorama item in WP7如何在 WP7 中以编程方式设置选定的全景项目
【发布时间】:2011-01-07 03:15:56
【问题描述】:

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

确认了这一点

有没有办法在全景图上手动设置选定的索引/项目?如果没有,它是否有办法记住选择了什么,即使用户离开应用程序来撰写电子邮件?

【问题讨论】:

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


【解决方案1】:

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

所以你可能有 3 个 PanoramaItemOnNavigatedTo() 处理程序,通过以下方式更改默认项:

panoramaControl.DefaultItem = panoramaControl.Items[indexToSet];

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

【讨论】:

  • 它可以正常导航,但是我们如何在导航时添加动画效果
  • 对我来说,这会改变全景标题的起始位置。也许是因为我应用了自定义标题模板。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    这不是一个完美的解决方案,因为它不能像全景图那样很好地滑动,而且效率可能不是很高,但另一方面,您并没有更改默认项目,因此您的用户界面保持一致。

    【讨论】:

    • 您可能应该更积极地改写您的序言,因为我认为使用您的解决方案我不会感到完全自在,正如它现在所说的那样。
    • 这是正确的方法...可惜没有幻灯片效果,但不会重新排列 UI。 +2 来自我。
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      设置新的选中项

      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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 不错。您应该修剪代码,以便解决方案更加明显。我几乎跳过了您的代码,因为它似乎无关紧要,但事实证明它解决了我的问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        相关资源
        最近更新 更多