Как программно установить выбранный элемент Панорамы в WP7 - PullRequest
13 голосов
/ 07 января 2011

Я использую управление панорамой в приложении WP7. Один из PanoramaItems переносит вас на другую страницу, которая затем позволяет отправлять электронную почту через EmailComposeTask. Если вы не выбрали отправку электронного письма и не нажали кнопку «Назад», Panorama вернется к элементу, который вы выбрали в последний раз. Однако, если вы решите отправить электронное письмо (и, следовательно, покинете приложение), оно не вернется к ранее выбранному PanoramaItem. Вместо этого он возвращается к первому элементу в Панораме. Я попытался отследить выбранный индекс и установить его, но я получил сообщение о том, что SelectedIndex не устанавливается. Это подтверждается в документации MSDN http://msdn.microsoft.com/en-us/library/microsoft.phone.controls.panorama.selectedindex%28VS.92%29.aspx

Можно ли вручную установить выбранный индекс / элемент на панораме? Если нет, есть ли способ вспомнить, что было выбрано, даже если пользователь покидает приложение, чтобы составить письмо?

Ответы [ 6 ]

34 голосов
/ 07 января 2011

Я не уверен, что вы можете программно форсировать анимацию на другую PanoramaItem, но вы можете изменить Panorama.DefaultItem .

Так что у вас может быть 3 PanoramaItemВ обработчике OnNavigatedTo() измените элемент по умолчанию с помощью:

panoramaControl.DefaultItem = panoramaControl.Items[indexToSet];

Это должно помочь при восстановлении после надгробия.

7 голосов
/ 07 января 2011

Вы можете попробовать решение, опубликованное Silicon Shark в этой теме. Замечено, что он работает, но только на начальном экране - что не должно быть проблемой для ваших требований восстановления состояния после захоронения.

Как программно установить видимый элемент в элементе управления Panorama?

Вы можете получить текущую активную страницу из свойства SelectedIndex панорамы.

К сожалению, установка DefualtItem является лишь приближением к решению этой проблемы, которую вы, возможно, уже обнаружили.

Редактировать: Учтите, что настройка DefaultItem изменяет, какая страница панорамы является первой страницей. Это небольшая разница, но вы увидите, как это важно, если посмотреть на положение заголовка и обтекание фонового изображения.

5 голосов
/ 12 декабря 2012

Вот решение. Он работает, как и ожидалось, и не меняет вашу панораму, поэтому ваш пользовательский интерфейс соответствует.

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

это не идеальное решение, поскольку оно не очень хорошо скользит, как панорама, и, вероятно, оно не очень эффективно, но, с другой стороны, вы не меняете элемент по умолчанию, поэтому ваш пользовательский интерфейс остается согласованным.

3 голосов
/ 21 сентября 2012

Я проверил решения, перечисленные здесь, без успеха. Вот что я сделал, это работает как шарм!

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

panorama.Items.Remove(panItem);

panorama.Items.Insert(0, panItem);

Вам необходимо удалить панель из списка и заново вставить ее в нужное место!

2 голосов
/ 20 июля 2012

Установить новый выбранный элемент с помощью

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 голос
/ 31 марта 2013

Я использую эту модель, чтобы изменить к развороту, когда устройство переходит в альбомном, я, вероятно, в конечном итоге извлечение текущего элемента в состояние приложения.Панорама в горизонтальной ориентации запрещена.

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