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

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

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

Ответы

Ответ 1

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

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

panoramaControl.DefaultItem = panoramaControl.Items[indexToSet];

Это поможет вам в восстановлении после захоронения.

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

Ответ 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 change.

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