Как программно установить выбранный элемент 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;
}
}