В WP7.1 выбранный индекс ListBox не работает должным образом. Как выбранный элемент может отображаться сверху?

СЦЕНАРИЙ:

  • В Windows Phone 7 я использую список.
  • Предположим, что имеется 200 элементов.
  • Теперь я выбираю 150-й элемент списка
  • Я хочу, чтобы список загружался и выбирал (и показывал) 150-й элемент в верхней части списка после загрузки.

ПРОБЛЕМА:

  • Я использую HookScrollViewer(), как указано на этой странице (смещение ListBox в WP7)
  • При первой загрузке элемента список не показывает правильный элемент (скажем, он показывает 148-й элемент).
  • Я выхожу с этой страницы и снова нажимаю на 150-й элемент.
  • Теперь индекс списка правильный, и он показывает 150-й элемент точно вверху.

ВОПРОС:

  • Я использую правильное решение?
  • Что я делаю не так, я пытался найти решение, но не смог!

НАМЕКАТЬ:

  • Если у вас телефон с ОС Windows, загрузите приложение: http://tinyurl.com/9298cdx.
  • Откройте любую главу и добавьте что-нибудь в закладки (длительным нажатием) в середине главы.
  • Закройте приложение и снова откройте приложение.
  • Нажмите на закладку, чтобы открыть ее.
  • В первый раз он не попадет в точное место.
  • Теперь НЕ закрывайте приложение, просто нажмите кнопку «Назад» и снова нажмите на закладку.
  • На этот раз расположение правильное!
  • Вопрос в том, что не так с первым разом?

КОД СТРАНИЦЫ ЧТЕНИЯ:

Большое спасибо!


person Shahaab    schedule 12.10.2012    source источник
comment
Я проверил XAML, и там все в порядке. Убрал анимацию, тоже не работает.   -  person Shahaab    schedule 12.10.2012
comment
Я добавил UpdateLayout() для ScrollViewer и ListBox, это не помогло.   -  person Shahaab    schedule 12.10.2012
comment
Дело в том, что работает нормально, со второго раза работает как надо, почему с первого раза не работает? Есть ли что-то, чего мне не хватает?   -  person Shahaab    schedule 12.10.2012
comment
Я никогда не создавал приложения для Windows phone, можете ли вы использовать Behaviors? я бы создал поведение и использовал функциональность, описанную в HookScrollViewer() в OnAttatch() и Invoke() поведения, чтобы даже при загрузке страницы она вызывалась, звучит ли это как хорошее решение, если да, я напишу быстрое поведение для селектора...   -  person eran otzap    schedule 12.10.2012
comment
Спасибо, Эран, я тоже новичок, это мое самое первое мобильное приложение любого рода, и когда я начинал, я ничего не знал о C#. Поэтому я не знаю, решит ли поведение проблему. Я хотел бы попробовать однако. пожалуйста, напишите это, и я попробую. Спасибо!   -  person Shahaab    schedule 12.10.2012
comment
Изменено ли поле «Свойства», которое поддерживает значение выбранного элемента списка, «Реализовать INotifyProperty»? Если да, определяет ли xaml для привязки BindingMode как BindingMode = TwoWay?   -  person Zack Weiner    schedule 13.10.2012
comment
Я не уверен, решит ли это проблему, но я заметил, что вы используете scrollViewer.ScrollToVerticalOffset(lst.SelectedIndex); - аргумент, который принимает ScrollToVerticalOffset, представляет собой высоту в пикселях, а не индекс. Если вы хотите использовать выбранный индекс, вы можете попробовать что-то вроде lst.ScrollIntoView(lst.SelectedItem);   -  person codechinchilla    schedule 16.10.2012
comment
Большое спасибо за предложения, я очень ценю. Теперь я нашел актуальную проблему и ее решение, которое размещено ниже. Ваше здоровье!   -  person Shahaab    schedule 19.10.2012


Ответы (2)


После борьбы я нашел актуальную проблему и ее решение.

Актуальная проблема:

  • Я использую внешние шрифты, отличные от тех, которые включены в WP по умолчанию.
  • Внешним шрифтам требуется некоторое время, чтобы загрузиться в память, а затем текст отображается.
  • При этом список уже загружается, а шрифт загружается.
  • Наконец, текст отображается, и (может быть, из-за расширения) выбранное местоположение индекса перемещается вниз.
  • Не закрывая приложение, шрифт как бы остается в памяти, и в следующий раз это не занимает много времени, и id указателя отображается корректно.

Мое решение:

  • Я загрузил (внешние) шрифты во время загрузки главной страницы. Это занимает незначительное количество времени и, следовательно, не влияет на эффективность приложения (с точки зрения времени загрузки).

Я хотел бы, чтобы какой-нибудь архитектор мог лучше объяснить, что происходит, или, другими словами, мне интересно знать техническую подоплеку «актуальной проблемы».

Большое спасибо всем тем, кто дал предложения.

person Shahaab    schedule 19.10.2012

Я предполагаю, что ваши данные не обновляются. Вы можете попробовать использовать INotifyPropertyChanged. Посмотрите на пример, который вы поймете, как использовать

person junjie.chen    schedule 18.10.2012